【问题标题】:How to replace dataframe values based on other columns and create a new dataframe如何根据其他列替换数据框值并创建新数据框
【发布时间】:2021-08-31 06:55:50
【问题描述】:

我有一个下面的数据框,我需要检查所有列的值并确保它们没有更新。

我根据键连接了两个数据框,并且必须比较两个 DataFrames 列,如客户名称、电话、电子邮件,并创建一个新的数据框,其中记录更新和替换值。

例如-:

以下数据框 custid z 已更新电子邮件地址,因为 email != email_update 并且 email 不为空,我们需要创建一个新的数据框,其中包含替换值和操作列。

df1(新数据)

custid   custname    email              phone
 x         tina     z.gmail.com        345-345-3456
 y         mina     z1.gmail.com       445-345-3456
 z         zina                                 555-345-3456
                        
 

df2(旧数据)

custid   custname    email              phone
 x         tina     ze.gmail.com        345-345-3456
 y         mina     z1.gmail.com       315-345-3456
 z         zina     z3@gmail.com       555-345-3456
 q         pina     z4@gmail.com       233-456-3456

df3

custid   custname    email              phone                    Action
 y         mina     z1.gmail.com       445-345-3456               Update
 x.         tina     z@gmail.com      345-345-3456               Update
 q         pina     z4@gmail.com       233-456-3456               Insert
 z.         Zina                             555-345-3456.               None

预期输出-:

比较两个 DataFrame 的 Python 代码。

我正在尝试比较两个 DataFrame 以获得插入、更新和删除的差异。

我能够找出插入和删除部分,但无法获取更新行。

   def compare_data(df,df1):
    
   df["Key"] = df["Custid"] + df["Custname"] 
   df1["Key"] = df1["Custid"] + df1["Custname"] 
   
   #########Insert Rows################################################
   df_result =  pd.merge(df1,df,on = 'Key', how = 'inner',suffixes=['', '_update'])
   df3 = df1[~df1['Key'].isin(df_result['Key'])]
   #########Delete Rows################################################
   df4 = df[~df['Key'].isin(df_result['Key'])]
   ###############################################################
   

我尝试过的事情

  df5 = pd.concat([df,df1]).drop_duplicates(subset = ['Privilege'],keep= False)

但它不工作并且行停留在那里。

【问题讨论】:

  • 你能给我们你的python代码吗?很难确切地说出您要做什么。
  • 对于单个 custid_key,custname_updated 包含一个值,即使 email, phone 没有更改。那么条件列是否只有电子邮件?..请发布创建DataFrame的代码。
  • 更新后的数据框中的邮件不应该是“z3...”吗?

标签: python pandas dataframe


【解决方案1】:

您不需要合并,只需子集:

df[df['email'] != df['updated_email']][['custid_Key', 'custname', 'email', 'phone']].assign(action='updated')

对于所有字段:

df[(df[['custname', 'email', 'phone']] != df[['custname_updated', 'email_updated', 'phone_updated']]).any(axis=1)][['custid_Key', 'custname', 'email', 'phone']].assign(action='updated')

【讨论】:

  • 我得到以下错误 ValueError: Can only compare same-labeled Series objects
【解决方案2】:

试试:

df['action'] = df.iloc[:, 1:4].ne(df.iloc[:, 4:7].values).any(axis=1) \
                              .replace({True: 'updated', False: ''})

输出:

>>> df
  custid_Key custname         email         phone custname_update  email_update  phone_update   action
0          x     tina   z.gmail.com  345-345-3456            tina   z.gmail.com  345-345-3456
1          y     mina  z1.gmail.com  445-345-3456             NaN  z1.gmail.com  445-345-3456  updated
2          z     zina  z2.gmail.com  555-345-3456            zina  z3.gmail.com  555-345-3456  updated
3          q     pina  z4.gmail.com  233-456-3456            pina  z4.gmail.com  231-456-3456  updated

另一个命题:

>>> df[['custid_Key']].join(
        df.iloc[:, 1:4].ne(df.iloc[:, 4:7].values)
                       .rename(columns=lambda c: f'is_{c}_updated')
)

  custid_Key  is_custname_updated  is_email_updated  is_phone_updated
0          x                False             False             False
1          y                 True             False             False
2          z                False              True             False
3          q                False             False              True

【讨论】:

  • @aditya。我更新了我的答案。请检查一下好吗?
  • @corralien 第二个提议的解决方案有效,但我必须显示来自新数据 df1 的值,而不是 true /false。如果 df1 为空且 df2 有值,则不要更新保持原样。跨度>
  • @corralien 收到此错误“无法强制转换为 DataFrame,形状” ValueError:无法强制转换为 DataFrame,形状必须为 (88, 11):给定 (88, 0)
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 2020-10-21
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多