簡體   English   中英

使用Pandas通過多列值將不同行的列表分組

[英]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

我的目標是將AC列中具有相同值的行分組,並合並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

如您所見, AC列中具有相同項目的行被合並,而如果至少一個不同,則它們將保持不變。 我的想法是使用groupbysum函數,如下所示:

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()

(要么)

sumlambda一起使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM