我有一个重复行的数据框
>>> 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()
时是否有更多惯用的方式来计算重复行?
答案 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
中没有其他列v
,DataFrame
:
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