Python 在Pandas中的GroupBy对象中进行筛选
下面是一个示例数据帧:Python 在Pandas中的GroupBy对象中进行筛选,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,下面是一个示例数据帧: import pandas as pd df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3], 'value':[42, 89, 250, 31, 130, 108, 107, 93]}) ID value 0 1 42 1 1 89 2 1 250 3 2 31 4 2 130 5 2 108 6 3
import pandas as pd
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3],
'value':[42, 89, 250, 31, 130, 108, 107, 93]})
ID value
0 1 42
1 1 89
2 1 250
3 2 31
4 2 130
5 2 108
6 3 107
7 3 93
对于每个ID,我希望提取值大于100的条目
使用groupby
我可以得到以下信息
grouped = df.groupby('ID')
for name, group in grouped:
print(name, group)
1 ID value
0 1 42
1 1 89
2 1 250
2 ID value
3 2 31
4 2 130
5 2 108
3 ID value
6 3 107
7 3 93
我想对每个组应用一个条件,以获得以下结果:
1 ID value
2 1 250
2 ID value
4 2 130
5 2 108
3 ID value
6 3 107
我尝试过使用groupby.filter
,但这会为整个组输出一个布尔条件。我想在组中应用布尔条件。我该怎么做
编辑:我应该指定每个组中的条件不同,因此我需要先执行groupby。您可以在循环之前或循环中按筛选:
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3],
'value':[42, 89, 250, 31, 130, 108, 10, 93]})
print (df)
ID value
0 1 42
1 1 89
2 1 250
3 2 31
4 2 130
5 2 108
6 3 10
7 3 93
如果某个组没有匹配的值,则忽略该组,如组3
:
grouped = df[df['value'] > 100].groupby('ID')
for name, group in grouped:
print(name, group)
1 ID value
2 1 250
2 ID value
4 2 130
5 2 108
或者,如果循环中的筛选器为不匹配的组返回空数据帧:
grouped = df.groupby('ID')
for name, group in grouped:
print(name, group[group['value'] > 100])
1 ID value
2 1 250
2 ID value
4 2 130
5 2 108
3 Empty DataFrame
Columns: [ID, value]
Index: []
编辑:
如果希望按各组不同的值进行筛选是可能的解决方案,请使用带有ID
列的字典,然后与value
进行比较,并按以下方式进行筛选:
详细信息:
print (df['ID'].map(d))
0 100
1 100
2 100
3 121
4 121
5 121
6 10
7 10
Name: ID, dtype: int64
我们可以用这种方式在熊猫身上做得更好
import pandas as pd
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3], 'value':[42, 89, 250, 31, 130, 108, 107, 93]})
df3 = df.query('value > 100')
print(df3.head())
输出将是
ID value
2 1 250
4 2 130
5 2 108
6 3 107
您可以应用以下功能:
def f(df, n):
return df[df['value'] > n]
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3],
'value':[42, 89, 250, 31, 130, 108, 107, 93]})
res = df.groupby('ID').apply(lambda x: f(x, 100))
嗯,当你可以将操作应用于整个事件时,为什么你需要一个groupby?我编辑了这个问题,以澄清每个组的条件不同,因此整个数据帧上的布尔过滤器不起作用。你是否根据键确定要选择什么?如果是这样,还有更好的解决方案。也许你可以提供一些解释?限制是由各组内的值分布设定的。例如,选择大于组平均值的所有值。类似于
df[df.value>df.groupby('ID')['value']].transform('mean')]
?谢谢-我编辑了这个问题,以澄清每个组的条件不同,因此整个数据帧上的布尔过滤器不起作用。我认为您的最后一个示例回答了我的问题。如果我使用group[group['value']]>x
并根据不同的组循环使用不同的x
值,我可以得到我想要的行为。谢谢
def f(df, n):
return df[df['value'] > n]
df = pd.DataFrame({'ID':[1,1,1,2,2,2,3,3],
'value':[42, 89, 250, 31, 130, 108, 107, 93]})
res = df.groupby('ID').apply(lambda x: f(x, 100))