![](/img/trans.png)
[英]How to create multiple list aggregations using groupby on a pandas dataframe in Python?
[英]Pandas create multiple aggregations
試着看看這與熊貓有多么難或多么容易。
假設有一列有兩列數據,例如:
Cat1 Cat2
A 1
A 2
A 3
B 1
B 2
C 1
C 2
C 3
D 4
如你所見, A
和C
有三個共同的元素1, 2, 3
。 B
然而僅具有兩個元件1和2, D
只有一個元素:4。
如何以編程方式獲得相同的結果。 這個想法是讓每個小組以某種方式返回。 因此, [A, C]
和[1, 2, 3]
,然后[B]
和[1, 2]
和[D]
與[4]
。
我知道可以編寫一個程序來做這個,所以我想弄清楚Pandas上是否有東西要做,而不必從頭開始構建東西。
謝謝!
您可以使用groupby
兩次來實現此目的。
df = df.groupby('Cat1')['Cat2'].apply(lambda x: tuple(set(x))).reset_index()
df = df.groupby('Cat2')['Cat1'].apply(lambda x: tuple(set(x))).reset_index()
我正在使用tuple
因為pandas需要元素才能進行分組才能進行groupby
。 上面的代碼不區分(1, 2, 3)
和(1, 1, 2, 3)
。 如果你想進行這種區分,頂替set
與sorted
。
結果輸出:
Cat2 Cat1
0 (1, 2) (B,)
1 (1, 2, 3) (A, C)
2 (4,) (D,)
你也可以:
df = df.set_index('Cat1', append=True).unstack().loc[:, 'Cat2']
df = pd.Series({col: tuple(values.dropna()) for col, values in df.items()})
df = df.groupby(df.values).apply(lambda x: list(x.index))
要得到
Cat1
(1.0, 2.0) [B]
(1.0, 2.0, 3.0) [A, C]
(4.0,) [D]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.