将多个值添加到列中-熊猫

时间:2019-06-04 16:58:54

标签: python pandas dataframe merge jupyter-notebook

我有两个熊猫数据框,我正在尝试将它们的ID编号合并在一起。但是,在df1中,该ID被多次使用,而在df2中,该ID仅被使用一次。因此,我希望最终的数据帧包含所有用逗号分隔并在其前面具有索引值的结果。我做了一个简单的例子,可以帮助我解释我的要求。

df1: picture of dataframe 1

df2: enter image description here

合并目标: enter image description here

我尝试过将它们合并为通常的操作:

MergedGoal= pd.merge(df1, df2, on='ID', how='left')

但是我收到ID的关键错误,可能是因为重复。如何将它们添加在一起?如果有人还可以给我一些见识,例如如何为每个增加的价值添加索引,那将是惊人的。但是,如果不可能添加完全正确的索引号,我只需要用逗号分隔同一条目中的所有值即可。

1 个答案:

答案 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 (当前列的内容) 在当前组中)并替换:

  • idx -当前元素索引,但从1开始
  • val -当前元素本身。

格式化结果项执行 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('')

如您所见:

  • 我恢复了合并DataFrame的顺序。这样结果 包含来自 df2 的第一列,然后包含来自 df1 的列。
  • 首先是 df1 中的
  • City State Zip 列 通过 ID 分组并使用 fn 函数进行汇总。
  • 然后将它们与 df2 合并。
  • 我添加了 fillna('')以空字符串替换 NaN 值, 如果 ID 仅存在于 df2 中,则会发生这种情况。