查找特定列的平均值,并保留所有具有特定平均值的行

时间:2019-12-05 09:12:55

标签: python pandas dataframe pandas-groupby mean

我有这个数据框。

from pandas import DataFrame
import pandas as pd

df = pd.DataFrame({'name': ['A','D','M','T','B','C','D','E','A','L'],
                   'id': [1,1,1,2,2,3,3,3,3,5],  
                   'rate': [3.5,4.5,2.0,5.0,4.0,1.5,2.0,2.0,1.0,5.0]})
>> df
  name  id  rate
0    A   1     3.5
1    D   1     4.5
2    M   1     2.0
3    T   2     5.0
4    B   2     4.0
5    C   3     1.5
6    D   3     2.0
7    E   3     2.0
8    A   3     1.0
9    L   5     5.0
df = df.groupby('id')['rate'].mean()

我想要的是什么: 1)找出每个“ id”的均值。
2)给出ID数(长度),其均值> =3。
3)退回数据帧的所有行(其中任何id的平均值> = 3。

Expected output:
Number of ids (length) where mean >= 3: 3

>> dataframe where (mean(id) >=3)

>>df
  name  id  rate
0    A   1     3.0
1    D   1     4.0
2    M   1     2.0
3    T   2     5.0
4    B   2     4.0
5    L   5     5.0

1 个答案:

答案 0 :(得分:3)

对于所有与原始DataFrame大小相同的组,均使用GroupBy.transform作为手段,因此可以通过boolean indexing进行过滤:

df = df[df.groupby('id')['rate'].transform('mean') >=3]
print (df)
  name  id  rate
0    A   1   3.5
1    D   1   4.5
2    M   1   2.0
3    T   2   5.0
4    B   2   4.0
9    L   5   5.0

详细信息

print (df.groupby('id')['rate'].transform('mean'))
0    3.333333
1    3.333333
2    3.333333
3    4.500000
4    4.500000
5    1.625000
6    1.625000
7    1.625000
8    1.625000
9    5.000000
Name: rate, dtype: float64

使用DataFrameGroupBy.filter的替代解决方案:

df = df.groupby('id').filter(lambda x: x['rate'].mean() >=3)