我有一个根据键/外键合并到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列创建多值字段
答案 0 :(得分:2)
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
的更常规解决方案并将所有列汇总到list
s:
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]