寻找特定列的平均值并保留所有具有该特定平均值的行。

3

我有这个数据框。

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)给出平均值大于等于3的“id”的数量(长度)。
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


A的平均值不应该是3.5吗? - Umar.H
1个回答

3

使用 GroupBy.transform 对于大小与原始数据框相同的所有组进行平均值计算,因此可以通过布尔索引进行筛选:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接