python - 如何通过计数过滤熊猫 DF 并同时平均组?
问题描述
有没有办法通过熊猫数据帧(.groupby)中的实例数有效过滤并计算所述过滤组的平均值?
让我们以我拥有的这个示例数据框为例。t_users
并c_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()
但它非常混乱并且无法正常工作。我想我可能在这里遗漏了一些简单的东西。
解决方案
您应该能够使用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
推荐阅读
- c++ - 对字符串进行标记时遇到问题
- c++ - 我无法使用 M5StickCPlus 的 wifi 接口。我在执行时收到错误
- typescript - 键入 ORM 查询多对多关系的最佳方式
- javascript - 键入时如何使输入字段垂直而不是水平扩展?
- python - Python - Tkinter GUI 中的框架或窗口
- sql - 为什么此查询返回所有行?
- spring - 在 S3 上上传生产就绪的 CSS、JS 文件
- python-3.x - 使用 ctypes 实现数组类是否比使用列表更有效?
- java - 显示来自 URL 的列表图像:http://localhost:8080/images/
- command-line - 从命令行 / crontab / autostart / Vosk 启动的程序