[英]Group lists of different rows by multiple columns values with Pandas
我有一個像這樣的數據df1
:
import pandas as pd
dic = {'A':[0,0,2,2,2,1,5,5],'B':[[1,5,3,8],[1,8,7,5],[7,8,9,5],[3],[1,5,9,3],[0,3,5],[],[4,2,3,1]],'C':['a','b','c','c','d','e','f','f'],'D':['0','8','7','6','4','5','2','2']}
df1 = pd.DataFrame(dic)
看起來像這樣:
#Initial dataframe
A B C D
0 0 [1, 5, 3, 8] a 0
1 0 [1, 8, 7, 5] b 8
2 2 [7, 8, 9, 5] c 7
3 2 [3] c 6
4 2 [1, 5, 9, 3] d 4
5 1 [0, 3, 5] e 5
6 5 [] f 2
7 5 [4, 2, 3, 1] f 2
我的目標是將A
和C
列中具有相同值的行分組,並合並B
列的內容,使結果看起來像這樣:
#My GOAL
A B C
0 0 [1, 5, 3, 8] a
1 0 [1, 8, 7, 5] b
2 2 [3, 7, 8, 9, 5] c
3 2 [1, 5, 9, 3] d
4 1 [0, 3, 5] e
5 5 [4, 2, 3, 1] f
如您所見, A
和C
列中具有相同項目的行被合並,而如果至少一個不同,則它們將保持不變。 我的想法是使用groupby
和sum
函數,如下所示:
df1.groupby(by=['A','C'],as_index=False,sort=True).sum()
但是Python返回錯誤消息: Function does not reduce
您能告訴我我的代碼行有什么問題嗎? 為了達到目標我應該寫些什么?
注意:我不在乎D
列會發生什么變化。
一種可能性是在itertools.chain(*iterables)
的幫助下將list
的列表弄平,直到用盡為止
import itertools
df1.groupby(['A', 'C'])['B'].apply(lambda x: list(itertools.chain(*x))).reset_index()
(要么)
將sum
與lambda
一起使用:
df1.groupby(by=['A','C'])['B'].apply(lambda x: x.sum()).reset_index()
兩種產量:
默認情況下, groupby().sum()
查找數字類型(標量)值以執行聚合,而不是查找諸如list
之類的元素的集合。
另一種可能性:
df1.groupby(by=['A','C'],as_index=False,sort=True).agg({'B': lambda x: tuple(sum(x, []))})
結果:
A C B
0 0 a (1, 5, 3, 8)
1 0 b (1, 8, 7, 5)
2 1 e (0, 3, 5)
3 2 c (7, 8, 9, 5, 3)
4 2 d (1, 5, 9, 3)
5 5 f (4, 2, 3, 1)
基於此答案 (列表在聚合中似乎無法很好地工作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.