gpt4 book ai didi

python - 基于优先级映射数据框列

转载 作者:行者123 更新时间:2023-12-03 18:57:27 28 4
gpt4 key购买 nike

我有一个主数据框(main_df),如:

     A     B       X    Y     Id1
0 cat cat1 catabc 0.1 uuid01
1 cat cat1 catxyz 0.4 uuid02
2 cat cat2 catpqr 0.5 uuid01
3 dog dog1 dogxyz 0.3 uuid03
4 dog dog2 dogpqr 0.2 uuid02
5 dog dog2 dogabc 0.8 uuid01
另一个有助于映射的数据帧(map_df):
     A     B       X    Y   Id2
0 cat cat1 catxyz 0.4 nx01
1 cat cat1 NaN NaN nx02
2 cat NaN NaN NaN nx03
3 dog dog1 dogxyz NaN nx04
4 dog NaN NaN NaN nx05
列映射的优先级顺序为: ['A', 'B', 'X', 'Y'] .
所以,如果一行的所有单元格 map_dfmain_df 的任意行匹配,那么 Id2的对应元素应该添加到 main_df .如 Y不存在,那么映射应该继续 ['A', 'B', 'X'] ;如果 X也没有,它应该继续 ['A', 'B']等等..
我能够通过数据帧合并实现部分结果。例如:
main_df = main_df.merge(map_df, how='left', on=['A', 'B', 'X', 'Y']))
但我无法在这里弄清楚基于优先级的角度。
作为映射的结果,数据帧(result_df)应该是这样的:
     A     B       X    Y     Id1   Id2
0 cat cat1 catabc 0.1 uuid01 nx02
1 cat cat1 catxyz 0.4 uuid02 nx01
2 cat cat2 catpqr 0.5 uuid01 nx03
3 dog dog1 dogxyz 0.3 uuid03 nx04
4 dog dog2 dogpqr 0.2 uuid02 nx05
5 dog dog2 dogabc 0.8 uuid01 nx05

最佳答案

这样就解决了。虽然不是很漂亮。
它是一种迭代算法,可以向前遍历数据,然后向后遍历数据。
前向传递以逐渐降低的优先级解决合并,从数据结构中消除匹配。它使用 inner merge战略。
反向传递将输出从最低优先级更新为最高优先级。
最后update通话有点慢,我注意到了。

merge_on = ['A', 'B', 'X', 'Y']
tot_cols = len(merge_on)

operation_main_df = main_df.copy()
outputs = []

# forward pass on progressively smaller sets
for first_idx in range(len(merge_on)):

merged_id2 = operation_main_df.merge(map_df, how='inner',
on=merge_on[0:tot_cols-first_idx],right_index=True,suffixes={"","_y"})

# the relevant output has the right number of NaN columns, the rest is garbage.
outputs.append(merged_id2[merged_id2.isna().sum(axis=1)==first_idx])


# backward updating pass
reverse_it = iter(outputs[::-1])

out = next(reverse_it)[['A','B','X','Y','Id1','Id2']].copy()
for el in reverse_it:
out.update(el)


输出:

A B X Y Id1 Id2
0 cat cat1 catabc 0.1 uuid01 nx02
1 cat cat1 catxyz 0.4 uuid02 nx01
2 cat cat2 catpqr 0.5 uuid01 nx03
3 dog dog1 dogxyz 0.3 uuid03 nx04
4 dog dog2 dogpqr 0.2 uuid02 nx05
5 dog dog2 dogabc 0.8 uuid01 nx05

编辑:在我的机器上加速 10 倍
# change
out = next(reverse_it)[['A','B','X','Y','Id1','Id2']]

# into
out = next(reverse_it)[['A','B','X','Y','Id1','Id2']].copy()

关于python - 基于优先级映射数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65564368/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com