Pandas仅在其他数据集缺少或NA时替换多个列

6ovsh4lw  于 2023-06-20  发布在  其他
关注(0)|答案(3)|浏览(100)

作为一个最小的工作示例,我有两个数据集,两个键[ col1col2 ]和多个数据列[以z_开始的列]。

df1 = pd.DataFrame(data= {'col1': [1, 2], 'col2': ["A", "B"], 'z_col3': [3, np.nan], 'z_col4': [3, 4]} )
df2 = pd.DataFrame(data= {'col1': [1,2], 'col2': ["C", "B"], 'z_col3': [3, 4], 'z_col4': [3, 4]} )

我想进行一次合并,其中z_列中缺失值的df1将从df2中获取值。有没有什么明智的方法来做到这一点?这是一个MWE,所以我有一个相当大的表与50+列。
我尝试了以下方法,但它产生了一个错误:

df1[['z_col3','z_col4']] = df2[['col1','col2']].map(df2.set_index(['col1','col2'])[['z_col3','z_col4']])

你知道怎么做吗?

nc1teljy

nc1teljy1#

我会考虑在对特定列进行过滤后使用带有fillna()的for循环。记住你可以使用fillna()而不是merge:

for x in [x for x in df if x.startswith('z')]:
   df_1[x] = df_1[x].fillna(df_2[x])
vsaztqbk

vsaztqbk2#

您可以合并:

df1 = df1.merge(df2, on=['col1','col2'], how='left')

然后使用np,其中:

import numpy as np
df1['z_col3_x'] = np.where(df1['z_col3_x'].isnull(), df1['z_col3_y'], df1['z_col3_x'])
df1['z_col4_x'] = np.where(df1['z_col4_x'].isnull(), df1['z_col4_y'], df1['z_col4_x'])

以后可以将列名重命名为它们的原始名称
要处理多个(50多个)列,可以用途:

for col in df1.columns:
    if (col.startswith('z_') & col.endswith('_x')):
        col = col[:-2]
        df1[col + '_x'] = np.where(df1[col + '_x'].isnull(), df1[col + '_y'], df1[col + '_x'])
        df1.drop(col + '_y', axis=1, inplace=True)
        df1.rename(columns={col + '_x': col}, inplace=True)
vhmi4jdf

vhmi4jdf3#

给定测试 Dataframe :

import pandas as pd
import numpy as np

df1 = pd.DataFrame(data= {'col1': [1, 2], 'col2': ["A", "B"], 'z_col3': [3, np.nan], 'z_col4': [3, 4]} )
df2 = pd.DataFrame(data= {'col1': [1, 2], 'col2': ["C", "B"], 'z_col3': [3, 4], 'z_col4': [3, 4]} )

df1.set_index(['col1', 'col2'], inplace=True)
df2.set_index(['col1', 'col2'], inplace=True)

df1.update(df2)

df1.reset_index(inplace=True)

然后简单地打印它:

print(df1)

相关问题