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

标签 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) 给出均值为 >= 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

最佳答案

使用GroupBy.transform for 表示与原始 DataFrame 具有相同大小的所有组,因此可能按 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)

关于python - 查找特定列的平均值并保留具有特定平均值的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59191701/

相关文章:

python - "Simpler"列表理解+product()组合的方法

python - 如何使用正则表达式在我的字符串中找到这个单词 'অশুভ' ?

python - Selenium 确定浏览器被卡住

python - pandas 数据框上的 numpy arange 实现

python - 如何从两个现有的单索引数据帧创建多索引数据帧?

python - 如何使 pandas 分类堆积条形图比例达到 100%

python - 对数组执行 argsort 操作时出现 IndexError

python - 从 DataFrame 字典创建 DataFrame

python - Pandas 按某些列分组

python - 删除列但保留特定值 pandas df