在pandas中,使用另一个数据框中的值填充空值。

5
我可以帮您进行翻译。下面是翻译的结果:

我有两个数据集。在dataframe1中,我有一列具有一些Null值。我想使用另一个数据集即dataframe2的值填充这些Null值,方法是通过比较每个数据集的不同列的值。

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数据框中完成这个任务。
3个回答

6
您可以使用 map 方法,并结合 combine_firstfillna 方法来替换 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

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

这是一个排序问题,您赢了先生。由于原帖没有提到最后的索引,所以让解决方案保持不变。 - Bharath M Shetty

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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接