我有两个数据帧df1和df2。两者都有第一列共同的SKUCode = SKU
df1:
df2:
如果SKUCode与df2中的SKU相匹配,我想更新df1并设置SKUStatus = 0。
如果来自df2的SKU与SKUCode不匹配,我想向df1添加新行。
因此,操作df1后如下所示:
我可以完成此操作的一种方法是通过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')
答案 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