pandas 根据与另一个 Dataframe 匹配的列替换列值

qvtsj1bj  于 2023-02-27  发布在  其他
关注(0)|答案(2)|浏览(147)

我有两个 Dataframe
Dataframe A

column1 column2 column3 column4 
1   a       2       True    23
2   b       2       False   cdsg
3   c       3       False   asdf
4   a       2       False   sdac
5   b       1       False   asdcd

Dataframe B是一个单行 Dataframe ,类似于

column1 column2 column3 column4
1   c       3       False    asdmn

我想做的是匹配前3列,如果找到,替换Column4的值,结果如下。

column1 column2 column3 column4 
1   a       2       True    23
2   b       2       False   cdsg
3   c       3       False   asdmn
4   a       2       False   sdac
5   b       1       False   asdcd

否则,如果不匹配,就把它附加在最后。我可以用一个简单的pd.append来完成最后一部分,但我首先需要使第一部分工作。

jogvjijk

jogvjijk1#

您可以使用此代码将第4列值替换为第二个 Dataframe 中的匹配数据。

    • 代码:**
import pandas as pd

df_a = pd.DataFrame({
    'column1': ['a', 'b', 'c', 'a', 'b'],
    'column2': [2, 2, 3, 2, 1],
    'column3': [True, False, False, False, False],
    'column4': ['23', 'cdsg', 'asdf', 'sdac', 'asdcd']
})

df_b = pd.DataFrame({
    'column1': ['c'],
    'column2': [3],
    'column3': [False],
    'column4': ['asdmn']
})

final_df = pd.merge(df_a, df_b, on=['column1', 'column2', 'column3'], how='left').copy()

final_df['column4'] = final_df['column4_y'].fillna(final_df['column4_x'])

final_df.drop(['column4_x', 'column4_y'], axis=1, inplace=True)

print(final_df)
    • 输出:**
column1  column2  column3 column4
0        a        2     True     23
1        b        2     False    cdsg
2        c        3     False    asdmn
3        a        2     False    sdac
4        b        1     False    asdcd
cnwbcb6i

cnwbcb6i2#

我建议合并,然后fillna:

df = df_a.merge(df_b, on = ['column1', 'column2', 'column3'], suffixes = ('_a', '_b'))
# check if merge succesfuly happened:
if df['column4'].isna().sum() < len(df['column4']):
    df['column4'] = df['column4_b'].fillna(df['column4_a'])
    df = df[['column1', 'column2', 'column3', 'column4']]
else:
    df = pd.concat([df_a, df_b])

df

相关问题