我有两个熊猫数据框,我正在尝试将它们的ID编号合并在一起。但是,在df1中,该ID被多次使用,而在df2中,该ID仅被使用一次。因此,我希望最终的数据帧包含所有用逗号分隔并在其前面具有索引值的结果。我做了一个简单的例子,可以帮助我解释我的要求。
我尝试过将它们合并为通常的操作:
MergedGoal= pd.merge(df1, df2, on='ID', how='left')
但是我收到ID的关键错误,可能是因为重复。如何将它们添加在一起?如果有人还可以给我一些见识,例如如何为每个增加的价值添加索引,那将是惊人的。但是,如果不可能添加完全正确的索引号,我只需要用逗号分隔同一条目中的所有值即可。
答案 0 :(得分:1)
我通过以下方式创建了 df1 :
df1 = pd.DataFrame(data=[
[ 1, 'Manchester', 'NH', 3108 ],
[ 1, 'Bedford', 'NH', 3188 ],
[ 6, 'Boston', 'MA', 23718 ],
[ 1, 'Austin', 'TX', 20034 ]],
columns=['ID', 'City', 'State', 'Zip'])
df1.Zip = df1.Zip.astype(str).str.zfill(5)
请注意,我更改了源代码 Zip (如我所见,它们是“普通的” 整数)转换为 string ,因为您要使用前导零。
要创建我使用过的 df2 :
df2 = pd.DataFrame(data=[[ 1, 'Best Cities', 'xxx' ], [ 6, 'Worst Cities', 'yyy' ]],
columns=['ID', 'Title', 'Description'])
作为准备步骤,让我们定义一个将要使用的函数 汇总 df1 中的列:
def fn(src):
lst = [ f'{idx}) {val}' for idx, val in enumerate(src, start=1) ]
return ', '.join(lst)
此功能的第一步是列表理解,其中 枚举遍历 src (当前列的内容) 在当前组中)并替换:
格式化结果项执行 f-string 。 结果是例如城市名称前面有数字。
return 语句将此列表连接到字符串中,并插入“,” 他们之间。
例如对于 ID == 1 和 City 列的组,源值为:
[ 'Manchester', 'Bedford', 'Austin' ]
,结果是:
1) Manchester, 2) Bedford, 3)Austin
。
并且实际处理可以通过单指令执行:
pd.merge(df2, df1.groupby('ID').agg(fn), how='left',
left_on='ID', right_index=True).fillna('')
如您所见: