Я пытался использовать pandas.where() для удаления отрицательных значений из столбца во фрейме данных.
Самый очевидный способ удалить отрицательные значения — просто запустить pandas.abs() для столбца. Так:
import pandas as pd
frame = pd.DataFrame([-1,-1,-3,-4,-5],columns=["amount"])
frame.amount = frame.amount.abs()
Но я хотел попробовать то же самое, используя pandas.where(). Итак, я попробовал следующее:
frame.amount = frame["amount"].where(frame["amount"] < 0, frame["amount"].abs(), inplace=True)
Что возвращает:
Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
amount
0 None
1 None
2 None
3 None
4 None
Меня смутили две вещи:
Просто измените <
на >
и удалите параметр inplace
. Обратите внимание, что в документации DataFrame.where
указано, что Replace values where the condition is **False**.
Не уверен, почему они отличались от логики np.where
. Это несколько нелогично + документы по методу .where
не очень точны.
Попробуйте с:
frame["amount"].where(~(frame["amount"] < 0), frame["amount"].abs(), inplace=True)
#frame["amount"].mask(frame["amount"] < 0, frame["amount"].abs(), inplace=True)
print(frame)
Where cond is True, keep the original value. Where False, replace with corresponding value from other.
Таким образом, условие должно быть ложным для назначения.
Аналогично series.mask()
, который говорит:
Replace values where the condition is True.
Так что мы можем использовать то же самое.
Что касается inplace=True
, когда вы используете это, нет необходимости назначать результаты обратно, поскольку inplace=True
выполняет операцию на месте, что так же хорошо, как не использовать на месте и присваивать результаты обратно. inplace=True
возвращает None
, который, если вы вернете серию, останется None
Используйте
frame.amount = frame["amount"].where(frame["amount"] > 0, frame["amount"].abs())