我有两个数据帧。在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中执行此操作。
答案 0 :(得分:4)
您可以map
使用combine_first
替换fillna
或here替换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))