首页 > 解决方案 > 熊猫通过“加入”另一个df来填充?

问题描述

我有 2 个 DF,一个带有 ID,一个带有条目。基本上:

ID    Val
1     111
2     222
3     333

另一个缺少一些 Vals 的地方:

ID    Val   Other
1     111   123
1     NaN   3
1     111   5
2     222   3553
2     NaN   58
2     222   321
3     NaN   456

我想做的是用第一个 df 中的 Val 值填充第二个 df 上 Val 中的缺失值。所以结果应该是:

ID    Val   Other
1     111   123
1     111   3
1     111   5
2     222   3553
2     222   58
2     222   321
3     NaN   456

我怎样才能做到这一点?我见过一个类似的用例,但来自同一个 df。当我尝试这个时,我得到一个错误 bc。我的 df 的尺寸当然不匹配。

所以问题是,如何通过“加入”填充我的 NaN 值?

标签: pythonpandasjoinfillna

解决方案


解决方案1:

您可以合并和使用np.where

vals = df2.merge(df1, on=['ID'], how='left', suffixes=['_',''])['Val']
df2['Val'] = np.where(df2['Val'].isna(), vals, df2['Val'])

速度:每个循环 1.87 ms ± 29.4 µs(平均值 ± 标准偏差,7 次运行,每次 100 个循环)


解决方案2:

创建一个映射字典并将值映射到 ID。

dct = df1.set_index('ID').to_dict()['Val']
df2.loc[df2['Val'].isna(), 'Val'] = df2['ID'].map(dct)

速度:每个循环 1.94 毫秒 ± 66.2 微秒(平均值 ± 标准偏差。7 次运行,每次 100 次循环)



样本数据:

import pandas as pd
import numpy as np
df1 = pd.DataFrame({'ID': {0: 1, 1: 2}, 'Val': {0: 111, 1: 222}})
df2 = pd.DataFrame({'ID': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 2}, 'Val': {0: 111.0, 1: np.nan, 2: 111.0, 3: 222.0, 4: np.nan, 5: 222.0}, 'Other': {0: 123, 1: 3, 2: 5, 3: 3553, 4: 58, 5: 321}})

输出:

   ID    Val  Other
0   1  111.0    123
1   1  111.0      3
2   1  111.0      5
3   2  222.0   3553
4   2  222.0     58
5   2  222.0    321

推荐阅读