如何使用python pandas groupby或.DataFrameGroupBy对象创建唯一组合列表
有没有更高效的方法来使用pandas的groupby,或者pandas.core.groupby.DataFrameGroupBy对象,来创建一个独特的列表、系列或数据框?我想要的是N列中2列的独特组合。例如,如果我有这些列:日期、姓名和购买的物品,而我只想知道姓名和日期的独特组合,这样做是可以的:
y = x.groupby(['Date','Name']).count()
y = y.reset_index()[['Date', 'Name']]
但是我觉得应该有更简洁的方法来使用
y = x.groupby(['Date','Name'])
不过,y.index给我报错,虽然y.keys可以正常工作。这让我想问一个更一般的问题,pandas.core.groupby.DataFrameGroupBy对象到底有什么用呢?
谢谢!
1 个回答
6
这里其实不需要用到--而且实际上也不应该用--groupby。你可以用drop_duplicates来获取唯一的行,效果会更好:
x.drop_duplicates(['Date','Name'])
示例:
In [156]: x = pd.DataFrame({'Date':[0,1,2]*2, 'Name':list('ABC')*2})
In [158]: x
Out[158]:
Date Name
0 0 A
1 1 B
2 2 C
3 0 A
4 1 B
5 2 C
In [160]: x.drop_duplicates(['Date','Name'])
Out[160]:
Date Name
0 0 A
1 1 B
2 2 C
不应该使用groupby的原因有:
x.groupby(['Date','Name']).count()
是对每个组里的元素数量进行统计,但这个统计结果并没有被使用,所以这就是多余的计算。- 如果
x
只有Date
和Name
这两列,使用x.groupby(['Date','Name']).count()
会报错,提示属性错误。 drop_duplicates
在这个情况下要快得多。
当你想对每个组进行某些操作时,才应该使用groupby
,比如统计每个组里的元素数量,或者计算某个统计值(例如总和或平均值等)。