熊猫:使用groupby

时间:2019-10-23 10:03:47

标签: python pandas pandas-groupby

我有一个重复行的数据框

>>> d = pd.DataFrame({'n': ['a', 'a', 'a'], 'v': [1,2,1]})
>>> d
   n  v
0  a  1
1  a  2
2  a  1

我想了解如何特别使用.groupby()方法,以便可以向数据框中添加新列,该列显示与当前行相同的行数。

>>> dd = d.groupby(by=['n','v'], as_index=False)  # Use all columns to find groups of identical rows
>>> for k,v in dd:
...      print(k, "\n", v, "\n")  # Check what we found
... 
('a', 1) 
    n  v
0  a  1
2  a  1 

('a', 2) 
    n  v
1  a  2 

当我尝试对所得的dd.count()对象进行DataFrameGroupBy时,我得到IndexError: list index out of range。似乎发生这种情况是因为所有列都用于分组操作,并且没有其他列可用于计数。同样,dd.agg({'n', 'count'})失败,ValueError: no results

我可以使用.apply()来实现看起来像结果的东西。

>>> dd.apply(lambda x: x.assign(freq=len(x)))
     n  v  freq
0 0  a  1     2
  2  a  1     2
1 1  a  2     1

但这有两个问题:1)索引发生了某些事情,因此很难将其映射回原始索引; 2)使用{{1}似乎不是惯用的熊猫书和手册discourage },因为它可能很慢。

使用.apply()时是否有更多惯用的方式来计算重复行?

1 个答案:

答案 0 :(得分:3)

一种解决方案是将GroupBy.size用于带有计数器的汇总输出:

d = d.groupby(by=['n','v']).size().reset_index(name='c')
print (d)
   n  v  c
0  a  1  2
1  a  2  1

如果在groupby之后指定一些列名称,则您的解决方案将起作用,因为在输入n中没有其他列vDataFrame

d = d.groupby(by=['n','v'])['n'].count().reset_index(name='c')

print (d)
   n  v  c
0  a  1  2
1  a  2  1

如果需要带有GroupBy.transform的新列,还需要什么-新列由汇总值填充:

d['c'] = d.groupby(by=['n','v'])['n'].transform('size')
print (d)
   n  v  c
0  a  1  2
1  a  2  1
2  a  1  2