【问题标题】:Pandas - create multi value fields after merging two dataframesPandas - 合并两个数据框后创建多值字段
【发布时间】:2018-08-25 12:46:16
【问题描述】:

我有一个根据键/外键合并到 csv 表的 python 脚本。由于关系有时是1 : n,因此我的输出数据包含每个 n 的新行。

我想要的是新外键列中包含多值字段的单行。

一些示例数据以便更好地理解:

CSV1

cid;name;surname;address
1;Mueller;Hans;42553
2;Meier;Peter;42873
3;Schmidt;Micha;42567
4;Pauli;Ulli;98790
5;Dick;Franz;45632

CSV2

cid;ticketid
1;9
1;22
2;8
3;7
4;6
5;5

期望的输出:

cid;name;surname;address;ticketid
1;Mueller;Hans;42553;[9;22]
2;Meier;Peter;42873;[8]
3;Schmidt;Micha;42567;[7]
4;Pauli;Ulli;98790;[6]
5;Dick;Franz;45632;[5]

我当前的合并代码:

df1 = pd.read_csv('kunde.csv', sep=';', header=0, dtype=object)
df2 = pd.read_csv('tickets.csv', sep=';', header=0, dtype=object, na_values='')


df = (df1.merge(df2, left_on='cid', right_on='cid', suffixes=('', '_B'), how='left'))

我找到了一些关于如何使用 group by 的示例。但我的情况的另一个问题是脚本需要有点通用,我需要假设我只知道我执行连接的两个 ID 列的名称,而不是所有列名。所以大多数示例不适用于我的情况或为所有非 ID 列创建多值字段

【问题讨论】:

  • 你能解释更多吗?在df2 中有多个列?
  • 是的,在我的df2 中有多个列,但我只需要将所有匹配的键转移到df1 中的新列中
  • 好的,我添加更通用的解决方案,希望是你想要的。
  • 第二个解决方案在第一次尝试时似乎很棒。我会测试并回复反馈。感谢您迄今为止的帮助!

标签: python pandas csv dataframe pandas-groupby


【解决方案1】:

我认为每个组需要mapgroupbylists:

df1['ticketid'] = df1['cid'].map(df2.groupby('cid')['ticketid'].apply(list))
print (df1)
   cid     name surname  address ticketid
0    1  Mueller    Hans    42553  [9, 22]
1    2    Meier   Peter    42873      [8]
2    3  Schmidt   Micha    42567      [7]
3    4    Pauli    Ulli    98790      [6]
4    5     Dick   Franz    45632      [5]

编辑:使用join 的更通用解决方案并将所有列聚合到lists:

print (df2)
   cid  ticketid  A
0    1         9  s
1    1        22  r
2    2         8  t
3    3         7  r
4    4         6  m
5    5         5  a

df = df1.join(df2.groupby('cid').agg(lambda x: x.tolist()), on='cid', rsuffix='_B')
print (df)
   cid     name surname  address ticketid       A
0    1  Mueller    Hans    42553  [9, 22]  [s, r]
1    2    Meier   Peter    42873      [8]     [t]
2    3  Schmidt   Micha    42567      [7]     [r]
3    4    Pauli    Ulli    98790      [6]     [m]
4    5     Dick   Franz    45632      [5]     [a]

【讨论】:

  • 第二种解决方案效果很好!感谢您的帮助!
  • @JohnnyKonfetti - 很高兴能帮上忙,周末愉快!
猜你喜欢
  • 1970-01-01
  • 2015-10-17
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多