用 pandas 中另一个数据框中的值填充 Nulls

Jac*_*iel 5 python dataframe pandas

我有两个数据框。在 dataframe1 中,我有一列包含一些空值。我想通过比较每个数据帧的不同列的值,使用另一个数据帧(即 dataframe2)的值来填充这些空值。

数据框1:

Col1 Col2
A    Null
B    Null
C    NUll
A    1000
B    1120
C    3200
Run Code Online (Sandbox Code Playgroud)

数据框2:

Col1 Col2
A    500
B    110
C    320
Run Code Online (Sandbox Code Playgroud)

现在我想用第二个数据帧中的值填充第一个数据帧中的空值,其中 dataframe1.col1 = dataframe2.col1

最终期望的输出如下:

Col1 Col2
A    500
B    110
C    320
A    1000
B    1120
C    3200
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Pandas Dataframes 中做到这一点。

jez*_*ael 6

您可以map与 Replace NaNs bycombine_first或 一起使用fillna

df1['Col2'] = df1['Col2'].mask(df1['Col2'] == 'Null')
print (df1)
  Col1  Col2
0    A   NaN
1    A   NaN
2    C   NaN
3    A  1000
4    B  1120
5    C  3200

df1['Col2'] = df1['Col2'].combine_first(df1['Col1'].map(df2.set_index('Col1')['Col2']))
#alternative 
#df1['Col2'] = df1['Col2'].fillna(df1['Col1'].map(df2.set_index('Col1')['Col2']))

print (df1)
  Col1  Col2
0    A   500
1    B   110
2    C   320
3    A  1000
4    B  1120
5    C  3200
Run Code Online (Sandbox Code Playgroud)

细节

print(df1['Col1'].map(df2.set_index('Col1')['Col2']))
0    500
1    500
2    320
3    500
4    110
5    320
Name: Col1, dtype: int64

print(df2.set_index('Col1')['Col2'])
Col1
A    500
B    110
C    320
Name: Col2, dtype: int64
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是按条件值过滤map

m = df1['Col2'] == 'Null'
df1.loc[m, 'Col2'] = df1.loc[m, 'Col1'].map(df2.set_index('Col1')['Col2'])
print (df1)
  Col1  Col2
0    A   500
1    B   110
2    C   320
3    A  1000
4    B  1120
5    C  3200
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 2

我的标准方法是将series.replace/series.fillna与series.map(dict)结合起来。

fill_dict = dataframe2.set_index('Col1')['Col2'].to_dict()
dataframe1['Col2'] = dataframe1['Col2'].replace('Null', dataframe1['Col1'].map(fill_dict))
Run Code Online (Sandbox Code Playgroud)