首页 > 解决方案 > 与 pandas 进行分组和合并

问题描述

我需要一些帮助。

我必须在“名称”列中转换此数据框而不重复

您可以看到我在“名称”列中有重复项,例如:John , Joan

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

有什么线索吗?

标签: python-3.xpandas

解决方案


首先,as_index=False如果您不希望名称作为 groupby 操作后的索引,请使用。

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

推荐阅读