2017-08-15 177 views
1

我有两个dataframes DF1和DF2与值替换一个数据帧零: DF1如下所示:从另一个数据帧

age 
0 42 
1 52 
2 36 
3 24 
4 73 

DF2如下所示:

age 
0 0 
1 0 
2 1 
3 0 
4 0 

我想更换df2中的所有零与df1中的相应条目。用更多的技术术语来说,如果df2中某个索引处的元素为零,那么我希望该元素被df1中的相应条目替换。

因此,我想DF2的样子:

age 
0 42 
1 52 
2 1 
3 24 
4 73 

我尝试使用替代方法,但它不能正常工作。请帮助:) 提前致谢。

回答

6

你可以使用where

In [19]: df2.where(df2 != 0, df1) 
Out[19]: 
    age 
0 42 
1 52 
2 1 
3 24 
4 73 

以上,df2 != 0我是一个布尔型DataFrame。

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为真,则使用相应的值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'], 熊猫执行自动索引标签对齐。 (注意上面的索引标签是0,1,3,4 - 跳过2)。因此df2.loc[df2['age'] == 0, 'age']中的值将被替换为d1['age']中的相应值。尽管d1['age']是索引标签0,1,2,34的系列,但由于在左侧没有相应的索引标签,所以2被忽略。

换句话说,

df2.loc[df2['age'] == 0, 'age'] = df1.loc[df2['age'] == 0, 'age'] 

将工作为好,但在右手侧所添加的限制是不必要的。

+0

谢谢。但是,当我尝试df2.where(df2 ['age']!= 0,df1)我得到AttributeError:'浮动'对象没有属性'全' – ZeusofCode

+0

我认为你遇到[此错误](https:// stackoverflow.com/q/26973803/190597) - 你可以通过升级你的熊猫版本来修复它。 – unutbu

+0

熊猫版本无法更改,因为它安装在服务器上,我只能使用那个:(我的熊猫版本是0.15.1' – ZeusofCode

2
In [30]: df2.mask(df2==0).combine_first(df1) 
Out[30]: 
    age 
0 42.0 
1 52.0 
2 1.0 
3 24.0 
4 73.0 

或 “否定” beautiful @unutbu's solution

In [46]: df2.mask(df2==0, df1) 
Out[46]: 
    age 
0 42 
1 52 
2 1 
3 24 
4 73 
+1

即使df2.mask(df2 == 0,df1)的作品:) – Vaishali

+1

@Vaishali,是的,谢谢!这是美丽的unutbu解决方案的“否定”:) – MaxU

1

或者尝试mul

df1.mul(np.where(df2==1,0,1)).replace({0:1}) 
相关问题