Я хочу вычесть каждый столбец из предыдущего ненулевого столбца, используя функцию diff - PullRequest
0 голосов
/ 02 ноября 2018

У меня длинный список столбцов, и я хочу вычесть предыдущий столбец из текущего столбца и заменить текущий столбец разницей. Так что если у меня есть:

A   B   C   D
1  NaN  3   7
3  NaN  8   10
2  NaN  6   11

Я хочу вывод:

A   B   C   D 
1  NaN  2   4
3  NaN  5   2
2  NaN  4   5

Я пытался использовать этот код: df2 = df1.diff (ось = 1) но это не дает желаемого результата

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы можете сделать это с помощью df.where, а затем update, чтобы вернуть первую запись non-null для каждой строки вашего DataFrame.

Пример данных: df

     A    B    C    D
0  1.0  NaN  3.0  7.0
1  1.0  4.0  5.0  9.0
2  NaN  4.0  NaN  4.0
3  NaN  4.0  NaN  NaN
4  NaN  NaN  3.0  7.0
5  3.0  NaN  NaN  7.0
6  6.0  NaN  NaN  NaN

Код:

df_d = df.where(df.isnull(), 
                df.fillna(method='ffill', axis=1).diff(axis=1))
df_d.update(df.where(df.notnull().cumsum(1).cumsum(1) == 1))

Выход: df_d

     A    B    C    D
0  1.0  NaN  2.0  4.0
1  1.0  3.0  1.0  4.0
2  NaN  4.0  NaN  0.0
3  NaN  4.0  NaN  NaN
4  NaN  NaN  3.0  4.0
5  3.0  NaN  NaN  4.0
6  6.0  NaN  NaN  NaN
0 голосов
/ 02 ноября 2018

На самом деле, он дает желаемый результат, но вы пытаетесь вычислить diff для значений nan, которые будут nan, поэтому diff работает должным образом. Для вашего случая просто извлеките первый столбец из исходного кадра данных, и все будет в порядке

df2=df1.diff(axis=1) 
df2.A=df1.A

print(df2)

выход

A   B   C   D
1   NaN 2.0 4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...