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