我有一个数据框:
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’等.
我可以通过 Select 包含任何这些字符串的行并将它们替换为‘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
现在,如果我 Select 包含‘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 小把戏?