【问题标题】:Pandas (Python) - Update column of a dataframe from another one with conditions and different columnsPandas (Python) - 使用条件和不同列从另一个数据框更新数据框的列
【发布时间】:2016-11-29 14:00:07
【问题描述】:

我遇到了问题,我找到了解决方案,但我觉得这是错误的方法。也许,有一种更“规范”的方式来做到这一点。

我已经had an answer for a really similar problem,但在这里我在每个数据帧中的行数不同。抱歉“重复发布”,但第一个仍然有效,所以我认为最好再发一个。

问题

我有两个数据框,我想在没有额外列且不删除现有信息的情况下合并它们。示例:

现有数据框 (df)

   A  A2  B
0  1   4  0
1  2   5  1
2  2   5  1

要合并的数据框 (df2)

   A  A2  B
0  1   4  2
1  3   5  2

如果“A”和“A2”列对应,我想用df2 更新df。 结果将是:

   A  A2    B
0  1   4  2 <= Update value ONLY
1  2   5  1
2  2   5  1

这是我的解决方案,但我认为这不是一个很好的解决方案。

import pandas as pd

df = pd.DataFrame([[1,4,0],[2,5,1],[2,5,1]],columns=['A','A2','B'])

df2 = pd.DataFrame([[1,4,2],[3,5,2]],columns=['A','A2','B'])

df = df.merge(df2,on=['A', 'A2'],how='left')
df['B_y'].fillna(0, inplace=True)
df['B'] = df['B_x']+df['B_y']
df = df.drop(['B_x','B_y'], axis=1)
print(df)

我试过这个解决方案:

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1)
df.loc[rows,'B'] = df2.loc[rows,'B']

但由于行数错误,我出现此错误:

ValueError: Can only compare identically-labeled DataFrame objects

有人有更好的方法吗? 谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为您可以使用DataFrame.isin 来检查DataFrames 中的相同行。然后由mask创建NaN,由combine_first填充。最后投到int

    mask = df[['A', 'A2']].isin(df2[['A', 'A2']]).all(1)
    print (mask)
    0     True
    1    False
    2    False
    dtype: bool
    
    df.B = df.B.mask(mask).combine_first(df2.B).astype(int)
    print (df)
       A  A2  B
    0  1   4  2
    1  2   5  1
    2  2   5  1
    

    【讨论】:

    • 谢谢!不是那么容易,但我会分析/学习/使用这个:D
    【解决方案2】:

    对创建布尔掩码的方式稍作调整,您就可以让它工作:

    cols = ['A', 'A2']
    # Slice it to match the shape of the other dataframe to compare elementwise
    rows = (df[cols].values[:df2.shape[0]] == df2[cols].values).all(1)
    df.loc[rows,'B'] = df2.loc[rows,'B']
    df
    

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 2021-09-06
      • 2022-10-14
      • 2018-11-05
      • 1970-01-01
      • 2018-07-08
      • 2019-10-14
      • 2019-07-26
      相关资源
      最近更新 更多