首页 > 解决方案 > 获取 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,mutaten()....

玩具示例:

  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)

标签: pythonpandaspandas-groupby

解决方案


编辑

在@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

希望这可以帮助。


推荐阅读