假设我有以下两个数据帧:
data = {
'Part' : ['part1', 'part2', 'part3', 'part4', 'part5'],
'Number' : ['123', '234', '345', '456', '567'],
'Code' : ['R2', 'R2', 'R4', 'R5', 'R5']
}
df = pd.DataFrame(data, dtype = object)
data2 = {
'Part' : ['part1', 'part2', 'part6', 'part4'],
'Number' : ['123', '234', '345', '456'],
'Code' : ['M2', 'R2', 'R4', 'M5']
}
df2 = pd.DataFrame(data2, dtype = object)
我的目标是在df
中创建一个名为Old_Code
的新列,如果df
和df2
中的Part
和Number
匹配,该列将从df2
中列出Code
的值。即Old_Code
将具有以下值:['M2', 'R2', NaN, 'M5', NaN]
我试过:
def add_code(df):
pdf_short.loc[(df['Part'] == df2['Part']) & (df['Number'] == df2['Number']), 'Old_Code'] = df2['Code']
add_code(df)
但由于数据帧的形状不匹配,我一直收到错误。有办法绕过这个问题吗?
我也试过:
def add_code1(df):
if (df['Part'] == df2['Part']) & (df['Number'] == df2['Number']):
return df2['Code']
df['Old_Code'] = df.apply(add_code1, axis = 1)
然而,我只是犯了错误。
这里有两种方法可以满足您的要求:
# First way
df = df.set_index(['Part','Number']).assign(Old_code=df2.set_index(['Part','Number']).Code).reset_index()
# Second way
df = df.merge(df2.rename(columns={'Code':'Old_code'}), how='left', on=['Part','Number'])
输出:
Part Number Code Old_code
0 part1 123 R2 M2
1 part2 234 R2 R2
2 part3 345 R4 NaN
3 part4 456 R5 M5
4 part5 567 R5 NaN