2016-11-29 908 views
0

我使用一些聚合功能做GROUPBY上的熊猫数据帧后,如:Python - Pandas数据框:聚合后的自定义聚合函数?

my_df.groupby(['id']).agg(['count']) 

我想知道是否有可能有一个定制的聚集功能?举例来说,在我的数据帧:

id  color 
--------------------  
001  red 
001  blue 
001  yellow 
002  green 
002  black 
003  yellow 
003  white 
003  blue 

我想创建一个名为all_color定制的功能,所以我可以做这样的事情:

my_df.groupby(['id']).agg(['all_color']) 

,并得到输出数据帧为:

id  all_color 
-------------------- 
001  [red,blue,yellow] 
002  [green,black] 
003  [yellow,white,blue] 

回答

1

使用apply函数和tolist()方法将值转换为列表。

In [12]: df.groupby('id')['color'].apply(lambda x: x.tolist()) 
Out[12]: 
id 
1  [red, blue, yellow] 
2   [green, black] 
3 [yellow, white, blue] 
Name: color, dtype: object 

使用reset_index该系列转换成数据帧

In [21]: df.groupby('id')['color'].apply(lambda x: x.tolist()).reset_index() 
Out[21]: 
    id     color 
0 1 [red, blue, yellow] 
1 2   [green, black] 
2 3 [yellow, white, blue] 
+0

谢谢!那么输出似乎不是一个数据帧,我们可以把它变成一个数据帧吗?谢谢! – Edamame

+0

或者至少为新列指定一个名称,以便稍后提及......谢谢。 – Edamame

+0

已更新,将系列转换为数据框。 – Zero

0

如果你想这是一个数据框,您可以使用pivot_table

In [11]: pd.pivot_table(df, values="id", index=df["id"], columns=df["color"], aggfunc='count', fill_value=0) 
Out[11]: 
color black blue green red white yellow 
id 
1   0  1  0 1  0  1 
2   1  0  1 0  0  0 
3   0  1  0 0  1  1 

注:这是非常相似的输出get_dummies