为什么pandas.where()返回'None'

时间:2019-05-27 13:58:53

标签: python-3.x pandas

我试图使用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

两件事使我感到困惑:

  • 让我感到惊讶的是我不得不分配每个表达式(frame.amount = ...),因为我认为在任何一种情况下调用该操作都会使Dataframe发生变化(不是'inplace'应该做什么?)和
  • pandas.where()为什么返回“ None”

1 个答案:

答案 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)

series.where()说:

  

如果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)