#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