与熊猫分组并合并

时间:2020-08-13 10:58:45

标签: python-3.x pandas

我需要一些帮助。

我必须转换此数据框,使其在“名称”列中没有重复内容

您会看到我在“名称”列中有重复项,例如:约翰·琼

df0 = pd.DataFrame({'name':['John','John','Joan','Joan','Juan'], 
                   'time':[20,10,11,18, 15], 
                   'amount':[100, 400, 200, 100, 300]})
df0

    name    time    amount
0   John    20  100
1   John    10  400
2   Joan    11  200
3   Joan    18  100
4   Juan    15  300

我需要对此进行转换,以这种方式对数据帧进行分组,我不知道这是否是正确的方式。

dfend0 = df0.groupby('name').agg(lambda x: x.tolist())
dfend0

             time   amount
name        
Joan    [11, 18]    [200, 100]
John    [20, 10]    [100, 400]
Juan    [15]        [300]

“名称”列现在是索引,这不是我一直在寻找的行为

 list(dfend0.columns.values)

    ['time', 'amount']

#现在我需要与其他数据框合并

df1 = pd.DataFrame({
    'name' : ['John' ,'Joan', 'Juan'],
    'address' : ['streetA','streetB','streetC'],
    'age' : [30,40,50]
})
df1

    name    address age
0   John    streetA 30
1   Joan    streetB 40
2   Juan    streetC 50

ender = df1.merge(df0)
ender

    name    address age time amount
0   John    streetA 30  20  100
1   John    streetA 30  10  400
2   Joan    streetB 40  11  200
3   Joan    streetB 40  18  100
4   Juan    streetC 50  15  300

这不是我想要的,这个例子会更准确:

    name    address age time    amount
0   John    streetA 30  20,10   100,400
1   Joan    streetB 40  11,18   200,100
2   Juan    streetC 50  15      300

有任何线索吗?

2 个答案:

答案 0 :(得分:1)

首先,如果您不想将名称用作groupby操作之后的索引,请使用as_index=False

2,不需要使用lambda .agg(list)

dfend0 = df0.groupby('name',as_index=False).agg(list)

然后照常合并。

df2 = pd.merge(df1,df0end,on='name')

   name  address  age      time      amount
0  John  streetA   30  [20, 10]  [100, 400]
1  Joan  streetB   40  [11, 18]  [200, 100]
2  Juan  streetC   50      [15]       [300]

注意,如果您不想使用列表(不建议使用,因为您丢失了基础数据类型并以字符串结尾)

df0end = df0.astype(str).groupby('name',as_index=False).agg(','.join)

   name   time   amount
0  Joan  11,18  200,100
1  John  20,10  100,400
2  Juan     15      300

df2 = pd.merge(df1,df0end,on='name')

   name  address  age   time   amount
0  John  streetA   30  20,10  100,400
1  Joan  streetB   40  11,18  200,100
2  Juan  streetC   50     15      300

答案 1 :(得分:0)

df = pd.DataFrame({'name':['John','John','Joan','Joan','Juan'],
                   'time':[20,10,11,18, 15],
                   'amount':[100, 400, 200, 100, 300]})


   df=df.astype(str).groupby('name').agg({
    'time':lambda x : ','.join(x),
'amount':lambda x : ','.join(x)

})

print(df)
         time   amount
name                
Joan  11,18  200,100
John  20,10  100,400
Juan     15      300

最后使用df=df.merge(df2,on='name')