Python:如何用一系列值替换Pandas数据框中的非零值

时间:2019-09-19 15:58:26

标签: pandas dataframe

我有一个3列4行(X1..X4)的数据框“ A”。 “ A”中的某些元素非零。我有另一个具有1列和4行(X1..X4)的数据框'B'。我想创建一个数据框“ C”,以便其中“ A”具有非零值,它将取自“ B”中等效行的值

我尝试了a.where(a!= 0,c)..显然不对,因为c不是标量

A = pd.DataFrame({'A':[1,6,0,0],'B':[0,0,1,0],'C':[1,0,3,0]},index=['X1','X2','X3','X4'])

B =  pd.DataFrame({'A':{'X1':1.5,'X2':0.4,'X3':-1.1,'X4':5.2}})

这些是预期的结果:

C = pd.DataFrame({'A':[1.5,0.4,0,0],'B':[0,0,-1.1,0],'C':[1.5,0,-1.1,0]},index=['X1','X2','X3','X4'])

3 个答案:

答案 0 :(得分:2)

fillna的使用方式

A=A.mask(A.ne(0)).T.fillna(B.A).T
A
Out[105]: 
      A    B    C
X1  1.5  0.0  1.5
X2  0.4  0.0  0.0
X3  0.0 -1.1 -1.1
X4  0.0  0.0  0.0

A=A.mask(A!=0,B.A,axis=0)
Out[111]: 
      A    B    C
X1  1.5  0.0  1.5
X2  0.4  0.0  0.0
X3  0.0 -1.1 -1.1
X4  0.0  0.0  0.0

答案 1 :(得分:2)

np.where()

如果您想分配回A:

A[:]=np.where(A.ne(0),B,A)

对于新的df:

final=pd.DataFrame(np.where(A.ne(0),B,A),columns=A.columns)

     A    B    C
0  1.5  0.0  1.5
1  0.4  0.0  0.0
2  0.0 -1.1 -1.1
3  0.0  0.0  0.0

答案 2 :(得分:1)

使用:

A.mask(A!=0,B['A'],axis=0,inplace=True)
print(A)

       A      B     C
X1   1.5    0.0   1.5
X2   0.4    0.0   0.0
X3   0.0   -1.1  -1.1
X4   0.0    0.0   0.0