我有一个数据帧:
In [1]: df = DataFrame({'A': [1, 1, 2, 2, 2],
'B': ['AF', 'PLAT', 'AF', 'PLAT', 'ROOT'],
'C': [.0015, .0018, .0021, .0011, .0008] })
In [2]: df
Out[2]:
A B C
0 1 AF 0.0015
1 1 PLAT 0.0018
2 2 AF 0.0021
3 2 PLAT 0.0011
4 2 ROOT 0.0008
我想得到所有A
的列表,它们在B
中至少有一个'AF'、'PLAT'和'ROOT'。根据该条件,只返回A
==2,因为A
==1不包含“ROOT”。你知道吗
这样做有效:
In [128]: gbdict = df.groupby(['A', 'B']).count().to_dict()['C']
In [129]: gbdict
Out[129]:
{(1L, 'AF'): 1,
(1L, 'PLAT'): 1,
(2L, 'AF'): 1,
(2L, 'PLAT'): 1,
(2L, 'ROOT'): 1}
In [130]: features = dict()
...: for k in gbdict:
...: features.setdefault(k[0], []).append(k[1])
In [131]: features
Out[131]: {1L: ['PLAT', 'AF'], 2L: ['AF', 'PLAT', 'ROOT']}
In [132]: alist = [k for k, v in features.items() if ('AF' in v and 'PLAT' in v and 'ROOT' in v)]
In [133]: alist
Out[133]: [2L]
但一定有更重要的东西
首先解决给定值
A
的问题:退货:
然后您可以使用
all
得到您的答案。你知道吗秒,
groupby
和apply
上述函数作为A
的每个值的答案:结果:
你也可以利用DataFrameGroupBy.filter文件方法,该方法返回其内容与给定筛选条件匹配的组:
这使用set comparison.issubset方法来确定每个组的B条目是否包含所需的值。您可以将其转换为一行代码,
df.groupby('A').filter(lambda g:set(['AF','PLAT','ROOT']).issubset(set(g.B)))
,但我个人认为显式调用所需的值更具可读性。你知道吗相关问题 更多 >
编程相关推荐