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 中做到这一点。
您可以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)
我的标准方法是将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)
| 归档时间: |
|
| 查看次数: |
4422 次 |
| 最近记录: |