Преобразование значений в отрицательные при условии значений из другого столбца

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть df, где я хочу преобразовать значение в столбце b в отрицательное число, если соответствующее значение в столбце a отсутствует NaN .

Вот мой код:

 # create a test df
df = pd.DataFrame(np.array([[12, 34], [67, 98], [np.nan, 6], [23, 45], [np.nan, 5], [5, 82], [61, 92]]), columns=['a', 'b'])

print(df)
    a   b
0   12.0    34.0
1   67.0    98.0
2   NaN     6.0
3   23.0    45.0
4   NaN     5.0


# the code to convert b to negative if a is not NaN
df['b'] = df['b'].apply(lambda x: -x if df['a'] != pd.isnull else x)
  

Это ошибка получения:

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
  

Я попытался найти код ошибки, но я не понимаю, что происходит. Я использую лямбда, но не уверен, есть ли лучший подход. Df должен выглядеть следующим образом:

 
    a   b
0   12.0    -34.0
1   67.0    -98.0
2   NaN     6.0
3   23.0    -45.0
4   NaN     5.0
  

Комментарии:

1. К вашему сведению, ряд, дающий нулевое df['a'] значение, равен pd.isnull(df['a'])

Ответ №1:

Простая однострочная строка дает вам нужный столбец:

 df['b'].where(df['a'].isna(), -df['b'])
  

Или, если вы хотите изменить df на месте:

 df.loc[df['a'].isna(), 'b'] *= -1
  

Ответ №2:

Я буду использовать combine_first with dropna , возможно, СЫРУЮ попытку 😉

 import numpy as np
import pandas as pd
df = pd.DataFrame(np.array([[12, 34], [67, 98], [np.nan, 6], [23, 45], [np.nan, 5], [5, 82], [61, 92]]), columns=['a', 'b'])
df['b'] = df.dropna()['b'].apply(lambda x: -x).combine_first(df['b'])
print(df)
  

Вывод

 a     b
0  12.0 -34.0
1  67.0 -98.0
2   NaN   6.0
3  23.0 -45.0
4   NaN   5.0
5   5.0 -82.0
6  61.0 -92.0