我有一个数据框:
lft rel rgt num
0 t3 r3 z2 3
1 t1 r3 x1 9
2 x2 r3 t2 8
3 x4 r1 t2 4
4 t1 r1 z3 1
5 x1 r1 t2 2
6 x2 r2 t4 4
7 z3 r2 t4 5
8 t4 r3 x3 4
9 z1 r2 t3 4
以及参考词典:
replacement_dict = {
'X1' : ['x1', 'x2', 'x3', 'x4'],
'Y1' : ['y1', 'y2'],
'Z1' : ['z1', 'z2', 'z3']
}
我的目标是替换所有出现的replacement_dict['X1']
与“X1”,然后将行合并在一起。例如,“x1”、“x2”、“x3”或“x4”的任何实例都将替换为“X1”等。
我可以通过选择包含任何这些字符串的行并将其替换为“X1”来完成此操作:
keys = replacement_dict.keys()
for key in keys:
DF.loc[DF['lft'].isin(replacement_dict[key]), 'lft'] = key
DF.loc[DF['rgt'].isin(replacement_dict[key]), 'rgt'] = key
giving:
lft rel rgt num
0 t3 r3 Z1 3
1 t1 r3 X1 9
2 X1 r3 t2 8
3 X1 r1 t2 4
4 t1 r1 Z1 1
5 X1 r1 t2 2
6 X1 r2 t4 4
7 Z1 r2 t4 5
8 t4 r3 X1 4
9 Z1 r2 t3 4
现在,如果我选择包含“X1”的所有行并将它们合并,我最终应该得到:
lft rel rgt num
0 X1 r3 t2 8
1 X1 r1 t2 6
2 X1 r2 t4 4
3 t1 r3 X1 9
4 t4 r3 X1 4
因此,三列 ['lft', 'rel', 'rgt'] 是唯一的,而 'num' 列是为每一行添加的。上面的第 1 行:['X1' 'r1' 't2' 6] 是两行 ['X1' 'r1' 't2' 4] 和 ['X1' 'r1' 't2' 2] 的总和。
我可以轻松地对少量行执行此操作,但我正在使用包含 600 万行的数据框和包含 60,000 个键的替换字典。使用简单的逐行提取和替换会花费很长时间。
如何有效地扩展这一点(特别是最后一部分)?有人可以推荐熊猫技巧吗?