首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用条件在pandas数据框中定位列值

使用条件在pandas数据框中定位列值
EN

Stack Overflow用户
提问于 2020-08-14 15:29:05
回答 2查看 197关注 0票数 2

我们有一个数据帧(df_source):

代码语言:javascript
运行
复制
Unnamed: 0  DATETIME    DEVICE_ID   COD_1   DAT_1   COD_2   DAT_2   COD_3   DAT_3   COD_4   DAT_4   COD_5   DAT_5   COD_6   DAT_6   COD_7   DAT_7
0   0   200520160941    002222111188    35  200408100500.0  12  200408100400    16  200408100300    11  200408100200    19  200408100100    35  200408100000    43  
1   19  200507173541    000049000110    00  190904192701.0  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
2   20  200507173547    000049000110    00  190908185501.0  08  190908185501    NaN NaN NaN NaN NaN NaN NaN NaN NaN 
3   21  200507173547    000049000110    00  190908205601.0  08  190908205601    NaN NaN NaN NaN NaN NaN NaN NaN NaN 
4   22  200507173547    000049000110    00  190909005800.0  08  190909005800    NaN NaN NaN NaN NaN NaN NaN NaN NaN 
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 
159 775 200529000843    000049768051    40  200529000601.0  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
160 776 200529000843    000049015792    00  200529000701.0  33  200529000701    NaN NaN NaN NaN NaN NaN NaN NaN NaN 
161 779 200529000843    000049180500    00  200529000601.0  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
162 784 200529000843    000049089310    00  200529000201.0  03  200529000201    61  200529000201    NaN NaN NaN NaN NaN NaN NaN 
163 786 200529000843    000049768051    40  200529000401.0  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 

我们计算了一个子集的values_cont,一个dict

代码语言:javascript
运行
复制
v_subset = ['COD_1', 'COD_2', 'COD_3', 'COD_4', 'COD_5', 'COD_6', 'COD_7']
values_cont = pd.value_counts(df_source[v_subset].values.ravel())

我们获得的结果(值,计数器):

代码语言:javascript
运行
复制
00    134
08     37
42     12
40     12
33      3
11      3
03      2
35      2
43      2
44      1
61      1
04      1
12      1
60      1
05      1
19      1
34      1
16      1

现在,问题是:

如何定位counter对应的列中的值,例如:

如何定位:

代码语言:javascript
运行
复制
 df['DEVICE_ID']  # corresponding with values ('00') and  counter ('134')
 df['DEVICE_ID']  # corresponding with values ('08') and  counter ('37')

 ...

 df['DEVICE_ID']  # corresponding with values ('16') and  counter ('1')
EN

回答 2

Stack Overflow用户

发布于 2020-08-14 15:45:10

  • 我相信你需要DataFrame.meltID的聚合连接和计数的GroupBy.size
  • 这个实现将产生一个数据帧,其中包含一个列(value)的CODES,所有相关的< code >D9,以及与每个代码相关的ids计数。在question.

中,

  • values_cont的替代方案

代码语言:javascript
运行
复制
v_subset = ['COD_1', 'COD_2', 'COD_3', 'COD_4', 'COD_5', 'COD_6', 'COD_7']

df = (df_source.melt(id_vars='DEVICE_ID', value_vars=v_subset)
               .dropna(subset=['value'])
               .groupby('value')
               .agg(DEVICE_ID = ('DEVICE_ID', ','.join), count= ('value','size'))
               .reset_index())
print (df)
   value                                          DEVICE_ID  count
0     00  000049000110,000049000110,000049000110,0000490...      7
1     03                                       000049089310      1
2     08             000049000110,000049000110,000049000110      3
3     11                                       002222111188      1
4     12                                       002222111188      1
5     16                                       002222111188      1
6     19                                       002222111188      1
7     33                                       000049015792      1
8     35                          002222111188,002222111188      2
9     40                          000049768051,000049768051      2
10    43                                       002222111188      1
11    61                                       000049089310      1


# print DEVICE_ID for CODES == '03'
print(df.DEVICE_ID[df.value == '03'])

[out]:
1    000049089310
Name: DEVICE_ID, dtype: object

根据与Pandas: Boolean Indexing相关的问题,

代码语言:javascript
运行
复制
# to return all rows where COD_1 is '00'
df_source[df_source.COD_1 == '00']

# to return only the DEVICE_ID column where COD_1 is '00'
df_source['DEVICE_ID'][df_source.COD_1 == '00']
票数 1
EN

Stack Overflow用户

发布于 2020-08-14 15:47:37

您可以使用df.iloc搜索基于列匹配的行。然后,您可以从该行中选择感兴趣的列并输出它。也许有一种更具蟒蛇风格的方法来做到这一点。

代码语言:javascript
运行
复制
df2=df.iloc[df['COD_1']==00]

df3=df2.iloc[df2['DAT_1']==134]

df_out=df3.iloc['DEVICE_ID']

.iloc上有更多信息:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63408380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档