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

时间:2018-01-20 17:30:33

标签: python pandas dataframe

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

DataFrame 1:

Col1 Col2
A    Null
B    Null
C    NUll
A    1000
B    1120
C    3200

数据框2:

Col1 Col2
A    500
B    110
C    320

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

最终所需的输出如下:

Col1 Col2
A    500
B    110
C    320
A    1000
B    1120
C    3200

如何在Pandas Dataframes中执行此操作。

3 个答案:

答案 0 :(得分:4)

您可以map使用combine_first替换fillnahere替换NaN

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

<强>详情:

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

另一种解决方案是按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

答案 1 :(得分:2)

您可以将字符串转换为nan,然后组合数据帧,即

df.assign(Col2 = pd.to_numeric(df.Col2,errors='coerce'))\
     .set_index('Col1').combine_first(df2.set_index('Col1')).reset_index())

   Col1    Col2
0    A   500.0
1    A  1000.0
2    B   110.0
3    B  1120.0
4    C   320.0
5    C  3200.0

答案 2 :(得分: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))