我有两个数据帧,如下所示:
import pandas as pd
d={'PART_NO': ['J661-03982','661-08913', '922-8972','661-00352','661-06291'], 'PART_NO_ENCODED': [541,1273,1110,1575,295]}
suggest = pd.DataFrame(data=d)
和
d={'A': [1161,224, 505,1033,812], 'B': [957,417,440,588,910],'C':[392,167,97,70,703],'D':[187,2021,3437,2416,2117],'PART_NO':[541,1273,1110,1575,295]}
result = pd.DataFrame(data=d)
我想用建议数据帧的PART_NO
替换结果数据帧中的PART_NO
。我正在执行以下操作:
df4 = result.replace(suggest.set_index('PART_NO_ENCODED').to_dict()['PART_NO'])
df4 = df4[result.isin(suggest['PART_NO_ENCODED'].tolist())]
但是问题是这正在替换PART_NO
的值,但使所有其他列成为NaN
。在我希望其他列值保持不变并且仅将PART_NO
替换为建议中的PART_NO
的情况下,该如何解决呢?
结果数据框应如下所示:
d={'A': [1161,224, 505,1033,812], 'B': [957,417,440,588,910],'C':[392,167,97,70,703],'D':[187,2021,3437,2416,2117],'PART_NO':['J661-03982','661-08913', '922-8972','661-00352','661-06291']}
result = pd.DataFrame(data=d)
答案 0 :(得分:2)
您可以使用df
将列放在相同的pd.merge
中。
import pandas as pd
d = {'PART_NO': ['J661-03982', '661-08913', '922-8972', '661-00352',
'661-06291'], 'PART_NO_ENCODED': [541, 1273, 1110, 1575, 295]}
suggest = pd.DataFrame(data=d)
d = {'A': [1161, 224, 505, 1033, 812], 'B': [957, 417, 440, 588, 910], 'C': [392, 167, 97,
70, 703], 'D': [187, 2021, 3437, 2416, 2117], 'PART_NO': [541, 1273, 1110, 1575, 295]}
result = pd.DataFrame(data=d)
result['PART_NO_ENCODED'] = result['PART_NO']
df = pd.merge(result, suggest, on=['PART_NO_ENCODED'])
df = df.drop(['PART_NO_ENCODED', 'PART_NO_x'], axis=1).rename(columns={'PART_NO_y': 'PART_NO'})
输出:
A B C D PART_NO
0 1161 957 392 187 J661-03982
1 224 417 167 2021 661-08913
2 505 440 97 3437 922-8972
3 1033 588 70 2416 661-00352
4 812 910 703 2117 661-06291
答案 1 :(得分:0)
您想要.map
。您可以选择填充未映射到以前的任何内容,而不是将其保留为NaN
(如果这是您想要的行为)。
s = suggest.set_index('PART_NO_ENCODED').PART_NO
result['PART_NO'] = result['PART_NO'].map(s)
#result['PART_NO'] = result['PART_NO'].map(s).fillna(result.PART_NO)
输出:result
A B C D PART_NO
0 1161 957 392 187 J661-03982
1 224 417 167 2021 661-08913
2 505 440 97 3437 922-8972
3 1033 588 70 2416 661-00352
4 812 910 703 2117 661-06291