你可以使用where:
In [19]: df2.where(df2 != 0, df1)
Out[19]:
age
0 42
1 52
2 1
3 24
4 73
在上面,df2 != 0 是一个布尔数据框。
In [16]: df2 != 0
Out[16]:
age
0 False
1 False
2 True
3 False
4 False
df2.where(df2 != 0, df1) 返回一个新的 DataFrame。其中df2 != 0 为True,则使用df2 的对应值。如果为 False,则使用 df1 的对应值。
另一种选择是使用df.loc 进行分配:
df2.loc[df2['age'] == 0, 'age'] = df1['age']
df.loc[mask, col] 选择 df 的行,其中布尔系列 mask 为 True,列标签为 col。
In [17]: df2.loc[df2['age'] == 0, 'age']
Out[17]:
0 0
1 0
3 0
4 0
Name: age, dtype: int64
在作业中使用时,例如df2.loc[df2['age'] == 0, 'age'] = df1['age'],
Pandas 执行自动索引标签对齐。 (注意上面的索引标签是 0,1,3,4 - 2 被跳过)。所以df2.loc[df2['age'] == 0, 'age'] 中的值被d1['age'] 中的对应值替换。即使d1['age'] 是一个带有索引标签0、1、2、3 和4 的系列,2 也会被忽略,因为左侧没有相应的索引标签一边。
换句话说,
df2.loc[df2['age'] == 0, 'age'] = df1.loc[df2['age'] == 0, 'age']
也可以,但不需要在右侧添加限制。