在Pandas中找到具有完整属性的分组项目

2024-10-16 17:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

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]

但一定有更重要的东西


Tags: and数据indataframedfforrootout
2条回答

首先解决给定值A的问题:

df1 = df[df['A'] == 1]
[b in df1['B'].tolist() for b in ['AF', 'PLAT', 'ROOT']]

退货:

[True, True, False]  # 'ROOT' is not in column B

然后您可以使用all得到您的答案。你知道吗

groupbyapply上述函数作为A的每个值的答案:

labels = ['AF', 'PLAT', 'ROOT']
df.groupby('A').apply(lambda d: all([b in d['B'].tolist() for b in labels]))

结果:

A
1    False
2     True

你也可以利用DataFrameGroupBy.filter文件方法,该方法返回其内容与给定筛选条件匹配的组:

# Define the required groups
req = set(['AF','PLAT','ROOT'])
# Group and filter results
f = df.groupby('A').filter(lambda g:req.issubset(set(g.B)))

#   A     B       C
#2  2    AF  0.0021
#3  2  PLAT  0.0011
#4  2  ROOT  0.0008

这使用set comparison.issubset方法来确定每个组的B条目是否包含所需的值。您可以将其转换为一行代码,df.groupby('A').filter(lambda g:set(['AF','PLAT','ROOT']).issubset(set(g.B))),但我个人认为显式调用所需的值更具可读性。你知道吗

相关问题 更多 >