python - 获取 groupby 多列的结果并直接在我的数据框中计数
问题描述
我有一个数据框(下面来自另一篇文章的玩具示例),您可以使用下面的代码生成它;我想按列“col1”和“col2”分组,并计算每个组中出现的次数,如下例所示:How to count of rows per group (and other statistics) in pandas group by?
但是要将结果直接包含在我的数据框中,就像在这个例子中一样(只有一列可以分组):Pandas,按计数分组并将计数添加到原始数据帧?
我努力了:
df['count'] = df.groupby(['col1','col2']).transform('count')
和:
df['count'] = df.groupby(['col1','col2'])[['col1','col2']].transform('count')
但我两次都得到同样的错误:
ValueError: Length of passed values is 10, index implies 0
知道如何在不必将结果合并到我的初始数据框的情况下解决这个问题吗?在 R dplyr 中,使用groupby
,mutate
和n()
....
玩具示例:
col1 col2 col3 col4 col5 col6
0 A B 0.20 -0.61 -0.49 1.49
1 A B -1.53 -1.01 -0.39 1.82
2 A B -0.44 0.27 0.72 0.11
3 A B 0.28 -1.32 0.38 0.18
4 C D 0.12 0.59 0.81 0.66
5 C D -0.13 -1.65 -1.64 0.50
6 C D -1.42 -0.11 -0.18 -0.44
7 E F -0.00 1.42 -0.26 1.17
8 E F 0.91 -0.47 1.35 -0.34
9 G H 1.48 -0.63 -1.14 0.17
生成玩具数据框的代码:
import numpy as np
import pandas as pd
keys = np.array([
['A', 'B'],
['A', 'B'],
['A', 'B'],
['A', 'B'],
['C', 'D'],
['C', 'D'],
['C', 'D'],
['E', 'F'],
['E', 'F'],
['G', 'H']
])
df = pd.DataFrame(
np.hstack([keys,np.random.randn(10,4).round(2)]),
columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6']
)
df[['col3', 'col4', 'col5', 'col6']] = df[['col3', 'col4',
'col5','col6']].astype(float)
解决方案
编辑
在@Alollz 注释之后,代码可以简化为一行,无需串联:
df['count'] = df.groupby(['col1', 'col2'])['col1'].transform('size')
编辑前回答
concatenated
解决方法是在应用 groupby 之前创建一个列。
之后,您可以size
在方法中使用该函数transform
。
也许不是最优雅的,但它确实有效。
代码
# make a concatenated column
df['concat'] = df.col1 + df.col2
# perform the transformation asked
df['count'] = df.groupby(['concat'])['concat'].transform('size')
# drop the concat column
df.drop('concat', axis=1, inplace=True)
col1col2col3 col4 col5 col6 count
0 A B -0.62 0.09 0.92 1.45 4
1 A B 1.49 0.31 -0.40 -0.99 4
2 A B -1.30 1.01 -0.31 -0.32 4
3 A B -0.05 0.32 -1.45 -0.54 4
4 C D -1.30 1.26 1.80 0.50 3
5 C D 0.75 0.13 0.49 -2.37 3
6 C D 1.05 -0.96 -0.44 -1.00 3
7 E F 0.31 -0.93 -1.78 -1.49 2
8 E F -0.23 0.30 0.77 1.46 2
9 G H -0.67 0.88 -0.26 -1.09 1
希望这可以帮助。
推荐阅读
- heroku - Heroku 部署失败
- python - pandas lexsort 是否取决于排序顺序?
- asp.net-core - ASP.NET Core 5 的帮助程序库 - NuGet 包不可用?
- html - 如何使用 SCRIPT SRC 打开新标签页
- html - Onload 模式弹出窗口不起作用!当我单独运行它时它完全可以工作,但是当我将它附加到我的网站代码时它不起作用!为什么?
- flutter - 方法不可用:ext.flutter.inspector.setPubRootDirectories
- xaml - 如何更改弹出菜单中所选项目的颜色?
- mongodb - MongoDB和python使用Motor,对数据库的读写操作显示错误
- hibernate - SQL 查询以检索 addScalar 值的值
- django - if request.method == "POST":指针没有出现在 if 语句中,谁能告诉我?