Pandas:如何合并两个数据框并使用第二个数据框的值填充 NaN 值
Pandas: How to merge two data frames and fill NaN values using values from the second data frame
我有一个 pandas 数据框 (df1),如下所示:
No car pl. Value Expected
1 Toyota HK 0.1 0.12
1 Toyota NY 0.2 NaN
2 Saab LOS 0.3 NaN
2 Saab UK 0.4 0.6
2 Saab HK 0.5 0.51
3 Audi NYU 0.6 NaN
3 Audi LOS 0.7 NaN
4 VW UK 0.8 NaN
5 Audi HK 0.9 NaN
我还有另一个数据框 (df2),如下所示:
No pl. Expected
2 LOS 0.35
3 NYU 0.62
3 LOS 0.76
5 HK 0.91
我希望我的最终数据框看起来像这样:
No car pl. Value Expected
1 Toyota HK 0.1 0.12
1 Toyota NY 0.2 NaN
2 Saab LOS 0.3 0.35
2 Saab UK 0.4 0.6
2 Saab HK 0.5 0.51
3 Audi NYU 0.6 0.62
3 Audi LOS 0.7 0.76
4 VW UK 0.8 NaN
5 Audi HK 0.9 0.91
我试过这个:
df = df1.fillna(df1.merge(df2, on=['No','pl.']))
但df1在输出中保持不变
我在这里看到的问题都是形状相同的数据框。当形状不同时,有没有办法做到这一点?
提前致谢!
使用带有 suffixes
参数的左连接,然后用 Series.fillna
with DataFrame.pop
替换缺失值以供使用并删除列 Expected_
:
df = df1.merge(df2, on=['No','pl.'], how='left', suffixes=('_',''))
df['Expected'] = df.pop('Expected_').fillna(df['Expected'])
print (df)
No car pl. Value Expected
0 1 Toyota HK 0.1 0.12
1 1 Toyota NY 0.2 NaN
2 2 Saab LOS 0.3 0.35
3 2 Saab UK 0.4 0.60
4 2 Saab HK 0.5 0.51
5 3 Audi NYU 0.6 0.62
6 3 Audi LOS 0.7 0.76
7 4 VW UK 0.8 NaN
8 5 Audi HK 0.9 0.91
因为我们有两个关键列,我们想要匹配和更新我们的 df1
数据框,我们可以使用 set_index
with fillna
,因为 fillna
在索引中对齐:
keys = ['No', 'pl.']
df1 = df1.set_index(keys).fillna(df2.set_index(keys)).reset_index()
No pl. car Value Expected
0 1 HK Toyota 0.1 0.12
1 1 NY Toyota 0.2 NaN
2 2 LOS Saab 0.3 0.35
3 2 UK Saab 0.4 0.60
4 2 HK Saab 0.5 0.51
5 3 NYU Audi 0.6 0.62
6 3 LOS Audi 0.7 0.76
7 4 UK VW 0.8 NaN
8 5 HK Audi 0.9 0.91
或者我们可以为此使用专用方法Series.update
:
df1 = df1.set_index(keys)
df1['Expected'].update(df2.set_index(keys)['Expected'])
df1 = df1.reset_index()
No pl. car Value Expected
0 1 HK Toyota 0.1 0.12
1 1 NY Toyota 0.2 NaN
2 2 LOS Saab 0.3 0.35
3 2 UK Saab 0.4 0.60
4 2 HK Saab 0.5 0.51
5 3 NYU Audi 0.6 0.62
6 3 LOS Audi 0.7 0.76
7 4 UK VW 0.8 NaN
8 5 HK Audi 0.9 0.91
我有一个 pandas 数据框 (df1),如下所示:
No car pl. Value Expected
1 Toyota HK 0.1 0.12
1 Toyota NY 0.2 NaN
2 Saab LOS 0.3 NaN
2 Saab UK 0.4 0.6
2 Saab HK 0.5 0.51
3 Audi NYU 0.6 NaN
3 Audi LOS 0.7 NaN
4 VW UK 0.8 NaN
5 Audi HK 0.9 NaN
我还有另一个数据框 (df2),如下所示:
No pl. Expected
2 LOS 0.35
3 NYU 0.62
3 LOS 0.76
5 HK 0.91
我希望我的最终数据框看起来像这样:
No car pl. Value Expected
1 Toyota HK 0.1 0.12
1 Toyota NY 0.2 NaN
2 Saab LOS 0.3 0.35
2 Saab UK 0.4 0.6
2 Saab HK 0.5 0.51
3 Audi NYU 0.6 0.62
3 Audi LOS 0.7 0.76
4 VW UK 0.8 NaN
5 Audi HK 0.9 0.91
我试过这个:
df = df1.fillna(df1.merge(df2, on=['No','pl.']))
但df1在输出中保持不变
我在这里看到的问题都是形状相同的数据框。当形状不同时,有没有办法做到这一点?
提前致谢!
使用带有 suffixes
参数的左连接,然后用 Series.fillna
with DataFrame.pop
替换缺失值以供使用并删除列 Expected_
:
df = df1.merge(df2, on=['No','pl.'], how='left', suffixes=('_',''))
df['Expected'] = df.pop('Expected_').fillna(df['Expected'])
print (df)
No car pl. Value Expected
0 1 Toyota HK 0.1 0.12
1 1 Toyota NY 0.2 NaN
2 2 Saab LOS 0.3 0.35
3 2 Saab UK 0.4 0.60
4 2 Saab HK 0.5 0.51
5 3 Audi NYU 0.6 0.62
6 3 Audi LOS 0.7 0.76
7 4 VW UK 0.8 NaN
8 5 Audi HK 0.9 0.91
因为我们有两个关键列,我们想要匹配和更新我们的 df1
数据框,我们可以使用 set_index
with fillna
,因为 fillna
在索引中对齐:
keys = ['No', 'pl.']
df1 = df1.set_index(keys).fillna(df2.set_index(keys)).reset_index()
No pl. car Value Expected
0 1 HK Toyota 0.1 0.12
1 1 NY Toyota 0.2 NaN
2 2 LOS Saab 0.3 0.35
3 2 UK Saab 0.4 0.60
4 2 HK Saab 0.5 0.51
5 3 NYU Audi 0.6 0.62
6 3 LOS Audi 0.7 0.76
7 4 UK VW 0.8 NaN
8 5 HK Audi 0.9 0.91
或者我们可以为此使用专用方法Series.update
:
df1 = df1.set_index(keys)
df1['Expected'].update(df2.set_index(keys)['Expected'])
df1 = df1.reset_index()
No pl. car Value Expected
0 1 HK Toyota 0.1 0.12
1 1 NY Toyota 0.2 NaN
2 2 LOS Saab 0.3 0.35
3 2 UK Saab 0.4 0.60
4 2 HK Saab 0.5 0.51
5 3 NYU Audi 0.6 0.62
6 3 LOS Audi 0.7 0.76
7 4 UK VW 0.8 NaN
8 5 HK Audi 0.9 0.91