如何使用python pandas groupby或.DataFrameGroupBy对象创建唯一组合列表

4 投票
1 回答
2466 浏览
提问于 2025-04-18 18:46

有没有更高效的方法来使用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的原因有:

  1. x.groupby(['Date','Name']).count()是对每个组里的元素数量进行统计,但这个统计结果并没有被使用,所以这就是多余的计算。
  2. 如果x只有DateName这两列,使用x.groupby(['Date','Name']).count()会报错,提示属性错误。
  3. drop_duplicates在这个情况下要快得多。

当你想对每个组进行某些操作时,才应该使用groupby,比如统计每个组里的元素数量,或者计算某个统计值(例如总和或平均值等)。

撰写回答