合并条件(或合并后用 NaN 替换)

Posted

技术标签:

【中文标题】合并条件(或合并后用 NaN 替换)【英文标题】:Merging on a condition (or replacing with NaNs after merging) 【发布时间】:2022-01-22 19:23:04 【问题描述】:

我想创建一个 new_column 合并 dfdf2 (df=pd.merge(df,df2, how='left', on='Type') ),但前提是 df['Type']=='certain_value'

因此,如果通过正常合并,new_column 将被完全填充,我想要一堆 NaN,并且只保留另一列满足特定条件的值。

有没有办法做到这一点?

我尝试在合并后用 NaN 替换值,但我也在为此苦苦挣扎:

np.where(df['Type']!='certain_value', np.NaN, df['new_column'])

这不符合我的意愿。

【问题讨论】:

检查:***.com/questions/23508351/… 合并前为什么不过滤? df=pd.merge(df.query("type == certain_value"),df2, how='left', on='Type') 【参考方案1】:

假设您的意思是要创建一个用 df2 中的特定列填充的新列,如果除了连接键之外没有列名重复,这应该可以工作。 (如果有那么它们将被添加后缀以区分来源)如果它是一个数字列,那么其他行将被隐式设置为 Nan。

rows_of_interest = df['Type']=='certain_value'

df.loc[rows_of_interest, 'new_column'] = pd.merge(df[rows_of_interest],df2, how='left', on='Type')['new_column']

【讨论】:

谢谢,非常接近,但由于某种原因,它只加入/保留 150 个值而不是 800 个。我的代码是 midstream_asset = df['Industry Sector']=='Midstream' df.loc [midstream_asset, 'Asset'] = pd.merge(df[midstream_asset],asset_lookup, on='Project Type', how='left')['Asset'],asset_lookup中的列名与原始 df(项目类型和资产)。没有拼写问题/空格/大写字母等 您可以检查 midstream_asset.sum() 和 df2[df2['Industry Sector'] == 'Midstream']] 的值,以确保您期望的数据被正确编入索引

以上是关于合并条件(或合并后用 NaN 替换)的主要内容,如果未能解决你的问题,请参考以下文章

pandas - 根据满足条件的列合并行

满足某些条件时将值替换为 NaN 或 Inf

如何在熊猫中合并两个数据框以替换 nan

合并两个数组而不用空替换

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

数据框中现有值的 Python 条件 NaN 值替换