首页 > 解决方案 > 如何通过计数过滤熊猫 DF 并同时平均组?

问题描述

有没有办法通过熊猫数据帧(.groupby)中的实例数有效过滤计算所述过滤组的平均值?

让我们以我拥有的这个示例数据框为例。t_usersc_users配对,与发生配对的月份和年份以及计算列。

x = [
[ 1000   , 4756   , 6  , 2017 , 0.36 ],
[1000   , 2357   , 6  , 2017 , 0.42 ],
[ 1000   , 2400   , 6  , 2017 , 0.76 ],
[ 1000   , 2400   , 6  , 2017 , 1.11 ],
[ 1000   , 2400   , 6  , 2017 , 0.27 ],
[ 1000   , 2400   , 6  , 2017 , 1.57 ],
[ 2399   , 9531   , 6  , 2017 , 0.57 ],
[ 3999   , 8532   , 6  , 2017 , 0.27 ],
[ 3999   , 2138   , 6  , 2017 , 1.76] ,
[ 1039   , 4215   , 6  , 2017 , 0.26]
]

df = pd.DataFrame(x, columns=['t_user','c_user','mo','yr','tval'])


|    | t_user | c_user | mo | yr   | tval |
|----|--------|--------|----|------|------|
| 0  | 1000   | 4756   | 6  | 2017 | 0.36 |
| 1  | 1000   | 2357   | 6  | 2017 | 0.42 |
| 2  | 1000   | 2400   | 6  | 2017 | 0.76 |
| 3  | 1000   | 2400   | 6  | 2017 | 1.11 |
| 4  | 1000   | 2400   | 6  | 2017 | 0.27 |
| 6  | 1000   | 2400   | 6  | 2017 | 1.57 |
| 7  | 2399   | 9531   | 6  | 2017 | 0.57 |
| 8  | 3999   | 8532   | 6  | 2017 | 0.27 |
| 9  | 3999   | 2138   | 6  | 2017 | 1.76 |
| 10 | 1039   | 4215   | 6  | 2017 | 0.26 |

在此示例中,我想对出现 4 次的所有用户对进行分组。只有一对符合此要求(索引 2 - 6,帐户对 1000 和 2400)。

我知道第一位很容易实现

df= df.groupby(['t_user', 'c_user', 'mo', 'yr']).size().reset_index(name='ct')
df = df[df['ct'] == 24].reset_index()

同时,我想tval在这 4 行中平均该对的列。我不需要任何其他数据。发生在哪里?

理想情况下,结果将应用于更大的数据集,返回满足数量要求的所有行,如下所示:

| t_user | c_user | mo | yr   | tval_avg |
|--------|--------|----|------|----------|
| 1000   | 2400   | 6  | 2017 |   0.93   |

我尝试了 adf.groupby().size()并加入了它,df.groupby.mean()但它非常混乱并且无法正常工作。我想我可能在这里遗漏了一些简单的东西。

标签: pythonpandaspandas-groupby

解决方案


您应该能够使用groupby+transform来计算、过滤和应用平均值。

transform将保留原始结构(并且只是重复值),因此您可以使用它来过滤相同的切片功能。

在下面的例子中:

gpd = df[
    df.groupby(['t_user', 'c_user', 'mo', 'yr']).transform('count').values >= 4 #filter by greater than 3
].groupby(['t_user', 'c_user', 'mo', 'yr']).agg({'tval': 'mean'}).reset_index() ## aggregate result

gpd
Out[1]:
    t_user  c_user  mo  yr      tval
0   1000    2400    6   2017    0.9275

推荐阅读