![](/img/trans.png)
[英]Merge/union Python Pandas DataFrames with column of unique row IDs and column of lists to DataFrame with all IDs and united, non-repeating lists?
[英]Grouping data in a dataframe to produce lists against unique ids in Pandas/Python
嗨,我正在使用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並不是特別有效。
數據透視表為您提供了更有用的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
這是另一種方式; 雖然@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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.