我有一个数据框:
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
给予:
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个键的替换字典的数据框,使用简单的逐行提取和替换需要很长时间。
如何高效地扩展这个过程(特别是最后一部分)?有人能推荐一些 Pandas 技巧吗?