我试图使用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
两件事使我感到困惑:
答案 0 :(得分:3)
尝试:
frame["amount"].where(~(frame["amount"] < 0), frame["amount"].abs(), inplace=True)
#frame["amount"].mask(frame["amount"] < 0, frame["amount"].abs(), inplace=True)
print(frame)
如果cond为True,则保留原始值。如果为False,则用其他值替换为相应的值。
因此,分配条件必须为假。
series.mask()
类似于:
替换条件为True的值。
所以我们也可以使用相同的东西。
关于inplace=True
,使用inplace=True
时不需要分配结果,就像inplace=True
进行就地操作一样,这与不使用就地并返回结果一样好。 None
返回None
,如果您将其分配回系列,则将lst = [1,2,3,4,5,6,7,8,9,10]
count = sum(n % 2 == 0 for n in lst)
print(lst)
print(count)