使用pandas按分组计数行数

3

我在pandas 0.17中拥有以下函数:

df['numberrows'] = df.groupby(['column1','column2','column3'], as_index=False)[['column1']].transform('count').astype('int')

但是我今天升级了pandas,现在出现了以下错误:
  File "/usr/local/lib/python3.4/dist-packages/pandas/core/internals.py",

line 3810, in insert raise ValueError('cannot insert {}, already exists'.format(item))

ValueError: cannot insert column1, already exists

更新中有什么变化导致此功能不再起作用?
我想按列分组,并添加一列,其中包含分组的行数。
如果之前所做的不是好的函数,则欢迎另一种在获取已分组行数的情况下进行分组的方法。
编辑:
小数据集:
    column1  column2    column3   
 0  test     car1       1           
 1  test2    car5       2         
 2  test     car1       1         
 3  test4    car2       1      
 4  test2    car1       1         

结果将是:

    column1  column2    column3   numberrows
 0  test     car1       1           2
 1  test2    car5       2           1     
 3  test4    car2       1           1
 4  test2    car1       1           1
2个回答

5
考虑以下方法:
In [18]: df['new'] = df.groupby(['column1','column2','column3'])['column1'] \
                       .transform('count')

In [19]: df
Out[19]:
  column1 column2  column3  new
0    test    car1        1    2
1   test2    car5        2    1
2    test    car1        1    2
3   test4    car2        1    1
4   test2    car1        1    1

更新:

In [26]: df.groupby(['column1','column2','column3'])['column1'] \
           .count().reset_index(name='numberrows')
Out[26]:
  column1 column2  column3  numberrows
0    test    car1        1           2
1   test2    car1        1           1
2   test2    car5        2           1
3   test4    car2        1           1

数值错误:传递了错误数量的项2,位置暗示1。 - user3605780
@user3605780,您能提供一个小的可重现数据集和所需的数据集吗? - MaxU - stand with Ukraine
我添加了一个集合,你的示例已经接近完成了,但是我需要删除重复行。 - user3605780
@user3605780,您可以在生成的数据框上使用drop_duplicates()方法。 - Germán Aquino

1
你的语法有些松散,你正在使用as_index=Falsetransform一起。
当它发现column1已经存在时,as_index=False将把这些列推回到数据框中...糟糕。 然而,这是完全不必要的,因为transform会为你处理索引。
df.groupby(
    ['column1','column2','column3']
)['column1'].transform('count').astype('int')

0    2
1    1
2    2
3    1
4    1
Name: column1, dtype: int64

或者创建一个新的列。
df.assign(
    new=df.groupby(
        ['column1','column2','column3']
    )['column1'].transform('count').astype('int')
)

  column1 column2  column3  new
0    test    car1        1    2
1   test2    car5        2    1
2    test    car1        1    2
3   test4    car2        1    1
4   test2    car1        1    1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接