Python: Как заменить ненулевые значения в кадре данных Pandas значениями из серии - PullRequest
1 голос
/ 19 сентября 2019

У меня есть фрейм данных 'A' с 3 столбцами и 4 строками (X1..X4).Некоторые из элементов в 'A' отличны от нуля.У меня есть другой фрейм данных 'B' с 1 столбцом и 4 строками (X1..X4).Я хотел бы создать фрейм данных «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 ]

2 голосов
/ 19 сентября 2019

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 голосов
/ 19 сентября 2019

Использование 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 голос
/ 19 сентября 2019

Использование:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...