我正在尝试合并两个数据帧并将左侧 df 中的 nan 替换为右侧 df,我可以用下面的三行代码来完成,但我想知道是否有更好/更短的方法?
# Example data (my actual df is ~500k rows x 11 cols)
df1 = pd.DataFrame({'a': [1,2,3,4], 'b': [0,1,np.nan, 1], 'e': ['a', 1, 2,'b']})
df2 = pd.DataFrame({'a': [1,2,3,4], 'b': [np.nan, 1, 0, 1]})
# Merge the dataframes...
df = df1.merge(df2, on='a', how='left')
# Fillna in 'b' column of left df with right df...
df['b'] = df['b_x'].fillna(df['b_y'])
# Drop the columns no longer needed
df = df.drop(['b_x', 'b_y'], axis=1)
原文由 Kenan 发布,翻译遵循 CC BY-SA 4.0 许可协议
混淆合并的问题是 两个数据框都有一个“b”列,但左右版本在不匹配的地方有 NaN。您首先要避免从
merge
获取不需要的多个“b”列“b_x”、“b_y” :merge(df2, 'left')
,这将从正确的数据帧中获取“b”(因为它只存在于正确的 df 中)df1.update(...)
,这将使用df1['b']
更新从 df2 获取的“b”列中的 NaNs解决方案:
注意: 因为我使用了
merge(..., how='left')
,所以我保留了调用数据帧的行顺序。如果我的df1
的值为a
不按顺序结果将是
这是预期的。
进一步…
如果你想在可能涉及更多列时更明确
更进一步…
如果你不想
update
数据帧,我们可以使用combine_first
快的
明确的
更进一步!…
'left'
merge
可能保留顺序但 不 保留索引。这是极端保守的方法: