我有一个重复行的数据框
>>> 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)这似乎不是惯用的熊猫,并且使用它可能会很慢,因此不鼓励使用手册.apply()
。
使用时还有更多惯用的方法来计算重复行.groupby()
吗?
一种解决方案是使用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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句