Skip to main content
 首页 » 编程设计

python之在数据框中对数据进行分组以根据 Pandas/Python 中的唯一 ID 生成列表

2025年05月04日10TianFang

您好,我正在使用 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 

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

在此先感谢您的帮助。

请您参考如下方法:

如果您真的想这样做,您可以使用 groupby apply:

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