使用来自另一个数据框的合并填充 na 值
Filling na values with merge from another dataframe
我有一个包含 na 值的列,我想根据键根据另一个数据框中的值来填充这些值。我想知道有没有简单的方法可以做到这一点
示例:
我有一个对象及其颜色的数据框,如下所示:
object color
0 chair black
1 ball yellow
2 door brown
3 ball **NaN**
4 chair white
5 chair **NaN**
6 ball grey
我想用以下数据框中的默认颜色填充颜色列中的 na 值:
object default_color
0 chair brown
1 ball blue
2 door grey
所以结果将是这样的:
object color
0 chair black
1 ball yellow
2 door brown
3 ball **blue**
4 chair white
5 chair **brown**
6 ball grey
有什么"easy"方法可以做到这一点吗?
谢谢:)
先创建Series然后替换NaN
s:
s = df1['object'].map(df2.set_index('object')['default_color'])
print (s)
0 brown
1 blue
2 grey
3 blue
4 brown
5 brown
6 blue
Name: object, dtype: object
df1['color']= df1['color'].mask(df1['color'].isnull(), s)
或者:
df1.loc[df1['color'].isnull(), 'color'] = s
或者:
df1['color'] = df1['color'].combine_first(s)
或者:
df1['color'] = df1['color'].fillna(s)
print (df1)
object color
0 chair black
1 ball yellow
2 door brown
3 ball blue
4 chair white
5 chair brown
6 ball grey
如果 object
中的唯一值:
df = df1.set_index('object')['color']
.combine_first(df2.set_index('object')['default_color'])
.reset_index()
或者:
df = df1.set_index('object')['color']
.fillna(df2.set_index('object')['default_color'])
.reset_index()
使用 np.where
并通过将列设置为索引进行映射,即
df['color']= np.where(df['color'].isnull(),df['object'].map(df2.set_index('object')['default_color']),df['color'])
或df.where
df['color'] = df['color'].where(df['color'].notnull(), df['object'].map(df2.set_index('object')['default_color']))
object color
0 chair black
1 ball yellow
2 door brown
3 ball blue
4 chair white
5 chair brown
6 ball grey
使用 loc
+ map
:
m = df.color.isnull()
df.loc[m, 'color'] = df.loc[m, 'object'].map(df2.set_index('object').default_color)
df
object color
0 chair black
1 ball yellow
2 door brown
3 ball blue
4 chair white
5 chair brown
6 ball grey
如果您要进行大量此类替换,您应该在 df2
上调用 set_index
一次并保存其结果。
我有一个包含 na 值的列,我想根据键根据另一个数据框中的值来填充这些值。我想知道有没有简单的方法可以做到这一点
示例: 我有一个对象及其颜色的数据框,如下所示:
object color
0 chair black
1 ball yellow
2 door brown
3 ball **NaN**
4 chair white
5 chair **NaN**
6 ball grey
我想用以下数据框中的默认颜色填充颜色列中的 na 值:
object default_color
0 chair brown
1 ball blue
2 door grey
所以结果将是这样的:
object color
0 chair black
1 ball yellow
2 door brown
3 ball **blue**
4 chair white
5 chair **brown**
6 ball grey
有什么"easy"方法可以做到这一点吗?
谢谢:)
先创建Series然后替换NaN
s:
s = df1['object'].map(df2.set_index('object')['default_color'])
print (s)
0 brown
1 blue
2 grey
3 blue
4 brown
5 brown
6 blue
Name: object, dtype: object
df1['color']= df1['color'].mask(df1['color'].isnull(), s)
或者:
df1.loc[df1['color'].isnull(), 'color'] = s
或者:
df1['color'] = df1['color'].combine_first(s)
或者:
df1['color'] = df1['color'].fillna(s)
print (df1)
object color
0 chair black
1 ball yellow
2 door brown
3 ball blue
4 chair white
5 chair brown
6 ball grey
如果 object
中的唯一值:
df = df1.set_index('object')['color']
.combine_first(df2.set_index('object')['default_color'])
.reset_index()
或者:
df = df1.set_index('object')['color']
.fillna(df2.set_index('object')['default_color'])
.reset_index()
使用 np.where
并通过将列设置为索引进行映射,即
df['color']= np.where(df['color'].isnull(),df['object'].map(df2.set_index('object')['default_color']),df['color'])
或df.where
df['color'] = df['color'].where(df['color'].notnull(), df['object'].map(df2.set_index('object')['default_color']))
object color 0 chair black 1 ball yellow 2 door brown 3 ball blue 4 chair white 5 chair brown 6 ball grey
使用 loc
+ map
:
m = df.color.isnull()
df.loc[m, 'color'] = df.loc[m, 'object'].map(df2.set_index('object').default_color)
df
object color
0 chair black
1 ball yellow
2 door brown
3 ball blue
4 chair white
5 chair brown
6 ball grey
如果您要进行大量此类替换,您应该在 df2
上调用 set_index
一次并保存其结果。