Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Pandas中的GroupBy对象中进行筛选_Python_Pandas_Pandas Groupby - Fatal编程技术网

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))