【问题标题】:update data frame based on data from another data frame using pandas python使用 pandas python 根据来自另一个数据帧的数据更新数据帧
【发布时间】:2020-09-20 20:18:51
【问题描述】:

我有两个数据框 df1 和 df2。两者都有第一列 common 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')

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

试试这个,使用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

【讨论】:

  • 您的 cod 中的 df_merge 应该是 df_m 吗?
  • 合并操作正在将我的 int 列(如 ListPrice)转换为十进制,有没有办法阻止这种情况?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 查看提供的代码,但在上面尝试时出现类型错误:'NoneType' 类型的对象没有 len()
    • jst 添加了代码。我认为问题在于两个 DF 的大小不同
    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2015-12-31
    • 2018-12-25
    • 2022-10-14
    • 2016-07-05
    • 2021-06-19
    • 2016-12-20
    相关资源
    最近更新 更多