python - 熊猫通过“加入”另一个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 值?
解决方案
解决方案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