假设我有以下两个数据帧:


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的新列,如果dfdf2中的PartNumber匹配,则列出df2Code的值. 即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

Python相关问答推荐

为什么'if x is None:pass'比'x is None'单独使用更快?

将链中的矩阵乘法应用于多组值

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

递归链表反转与打印语句挂起

如何从一个维基页面中抓取和存储多个表格?

如果列包含空值,则PANAS查询不起作用

VSCode Pylance假阳性(?)对ImportError的react

将标签与山脊线图对齐

了解如何让库认识到我具有所需的依赖项

Django/Python-UpdateView中的Delete函数正在复制,而不是删除

在Python Polar中从一个函数调用添加多个列

更改我的NN中的隐藏层数会导致错误

如何使一个更有效的映射函数基于一个以另一个嵌套框架的索引和列名作为其数据集的嵌套框架?

Python如何模拟S由高阶函数返回的函数

ImportError Django无法导入名称SignupView'

没有与提供的参数匹配

NumPy使用其他2个3D数组和一个1D数组创建一个3D数组来区分

基于反向特征 Select 的SCRICKIT-LINE和PCA特征 Select

如何使用建议值设置不区分大小写的模型

基于多个条件和未知数的数据抽取算法