使用熊猫python基于来自另一个数据帧的数据更新数据帧

时间:2020-06-02 11:13:07

标签: python pandas dataframe

我有两个数据帧df1和df2。两者都有第一列共同的SKUCode = SKU

df1:

enter image description here

df2:

enter image description here

如果SKUCode与df2中的SKU相匹配,我想更新df1并设置SKUStatus = 0。

如果来自df2的SKU与SKUCode不匹配,我想向df1添加新行。

因此,操作df1后如下所示:

enter image description here

我可以完成此操作的一种方法是通过df2.iterrows()并遍历值,但是我认为必须有另一种巧妙的方法? 谢谢

import pandas as pdx

df1=pdx.DataFrame({'SKUCode':['A','B','C','D'],'ListPrice':[1798,2997,1798,999],'SalePrice':[1798,2997,1798,999],'SKUStatus':[1,1,1,0],'CostPrice':[500,773,525,300]})

df2=pdx.DataFrame({'SKUCode':['X','Y','B'],'Status':[0,0,0],'e_date':['31-05-2020','01-06-2020','01-06-2020']})


df1.merge(df2,left_on='SKUCode')

3 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解您,但是我认为您可以使用.loc。类似于:

df1.loc[df2['SKUStatu'] != 0, 'SKUStatus'] = 1

答案 1 :(得分:0)

您应该看看pd.merge函数[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html]

首先重命名具有相同名称的列(例如,将SKU重命名为SKUCode)。然后尝试:

df1.merge(df2, left_on='SKUCode')

如果您提供输入数据(而不是屏幕截图),我可以尝试使用适当的参数。

答案 2 :(得分:0)

使用outer merge尝试此操作,它会同时提供匹配和不匹配的记录。

In [75]: df_m = df1.merge(df2, on="SKUCode", how='outer')                                                                                                         

In [76]: mask = df_m['Status'].isnull()                                                                                                                       

In [77]: df_m.loc[~mask, 'SKUStatus'] = df_m.loc[~mask, 'Status']

In [78]: df_m[['SKUCode', "ListPrice", "SalePrice", "SKUStatus", "CostPrice"]].fillna(0.0)

输出

  SKUCode  ListPrice  SalePrice  SKUStatus  CostPrice
0       A     1798.0     1798.0        1.0      500.0
1       B     2997.0     2997.0        0.0      773.0
2       C     1798.0     1798.0        1.0      525.0
3       D      999.0      999.0        0.0      300.0
4       X        0.0        0.0        0.0        0.0
5       Y        0.0        0.0        0.0        0.0
相关问题