我需要一些帮助。
我必须转换此数据框,使其在“名称”列中没有重复内容
您会看到我在“名称”列中有重复项,例如:约翰·琼
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
有任何线索吗?
答案 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')