【问题标题】:Grouping data in a dataframe to produce lists against unique ids in Pandas/Python在数据框中对数据进行分组以生成针对 Pandas/Python 中唯一 ID 的列表
【发布时间】:2013-08-22 13:23:57
【问题描述】:

您好,我正在使用 pandas/python 并且有一个数据框,如下所示:

21627   red
21627   green
21627   red
21627   blue
21627   purple
21628   yellow
21628   red
21628   green
21629   red
21629   red

我想简化为:

21627   red, green, blue, purple
21628   yellow, red, green
21629   red

最好的方法是什么(并将列表中的所有值折叠为唯一值)?

另外,如果我想保留冗余:

21627   red, green, red, blue, purple
21628   yellow, red, green
21629   red, red

实现这一目标的最佳方法是什么?

提前感谢您的帮助。

【问题讨论】:

标签: python pandas


【解决方案1】:

如果你真的想要这样做,你可以使用 groupby 申请:

In [11]: df.groupby('id').apply(lambda x: list(set(x['colours'])))
Out[11]: 
id
21627    [blue, purple, green, red]
21628          [green, red, yellow]
21629                         [red]
dtype: object

In [12]: df.groupby('id').apply(lambda x: list(x['colours']))
Out[12]: 
id
21627    [red, green, red, blue, purple]
21628               [yellow, red, green]
21629                         [red, red]
dtype: object

但是,包含列表的 DataFrame 并不是特别有效。

Pivot table 为您提供更有用的 DataFrame:

In [21]: df.pivot_table(rows='id', cols='colours', aggfunc=len, fill_value=0)
Out[21]: 
colours  blue  green  purple  red  yellow
id                                       
21627       1      1       1    2       0
21628       0      1       0    1       1
21629       0      0       0    2       0

我最喜欢的功能get_dummies 可以让你做到这一点,但没有那么优雅或高效(但我会保留这个原始的,如果疯狂的话):

In [22]: pd.get_dummies(df.set_index('id')['colours']).reset_index().groupby('id').sum()
Out[22]: 
       blue  green  purple  red  yellow
id                                     
21627     1      1       1    2       0
21628     0      1       0    1       1
21629     0      0       0    2       0

【讨论】:

  • 可以将这些类型的食谱添加到食谱中
  • 嘿,安迪,谢谢 - 我将使用针对每个 ID 的列表作为表格在搜索引擎中建立索引 - 因此想要针对每个 ID 的关键字列表
【解决方案2】:

这是另一种方式;虽然@Andy 更直观一些

In [24]: df.groupby('id').apply(
              lambda x: x['color'].value_counts()).unstack().fillna(0)
Out[24]: 
       blue  green  purple  red  yellow
id                                     
21627     1      1       1    2       0
21628     0      1       0    1       1
21629     0      0       0    2       0

【讨论】:

  • 这不是你拼写颜色的方式:p,value_counts 使它更直观,但我认为pivot_table 是这样做的方式。
  • 我同意pivot_table 更好; (这基本上就是它在内部所做的);我一直认为colour 是口语拼写(已弃用):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2020-11-05
  • 2021-06-03
  • 2018-03-06
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多