Pandas DataFrame where()函数的详细指南

3,040 阅读4分钟

Pandas有一些引人注目的数据结构:

  1. 一个有多列的表格就是DataFrame
  2. DataFrame的一列,或者一个类似列表的对象,被称为系列

DataFrame是一个很像SQL或Excel的表。它的结构相似,使得它可以使用类似的操作,如聚合、过滤透视

Pandas where

Pandas where()是一个库函数,用于检查DataFrame的一个或多个条件并返回结果。pd.DataFrame.where()函数接受多个参数并根据条件返回结果。

默认情况下,不满足条件的行被填充为NaN 值。 numpy where和pandas where的区别在于,DataFrame提供了调用where()方法时的默认值。

语法

DataFrame.where(cond, other=nan, inplace=False, 
                axis=None, level=None, errors=’raise’, 
                try_cast=False, raise_on_error=None)

参数

cond: bool 系列/DataFrame,类似数组,或可调用。

如果where条件为True,保留原值。如果where cond为False,则用其他相应的值来替换。 如果cond是可调用的,则对Series/DataFrame进行计算,并返回布尔值Series/DataFrame或数组。

other: 标量、Series/DataFrame或可调用条目,如果cond为False, 则用其他参数 中的相应值替换。如果其他项是可调用的,那么它将在Series/DataFrame上进行计算,并且应该返回标量或Series/DataFrame。

inplace: bool, default False

是否对数据进行就地操作。

axis: int,默认为none

对齐轴,如果需要的话。

level :int,默认为None

对齐水平,如果需要的话。

errors: str,{'提高','忽略'},默认为'提高'。

注意,目前,errors参数不会影响结果,并且会一直强制到一个合适的dtype。

  1. 'raise': 允许异常被提出。
  2. 'ignore':抑制错误时的异常返回原始对象。

try_cast: bool, default False.

尝试将一个结果转换为输入类型(如果可能的话)。

返回值

它返回与调用者相同的类型。

实现Pandas DataFrame where()

请看下面的代码:

# app.py

import pandas as pd

data = {'Show': ['Stranger Things', 'The X-Files', 'Mandalorian', 'The Boys'],
        'Streaming': ['Netflix', 'Fx', 'Disney Plus', 'Amazon Prime'],
        'Season': [3, 12, 1, 2],
        'Main Actor': ['Millie', 'Gillian', 'Pedro', 'Karl Urban']}
df = pd.DataFrame.from_dict(datae

# filtering data
filter = df["Show"] == "Mandalorian"

df.where(filter, inplace=True)
print(df)

输出

          Show    Streaming  Season Main Actor
0          NaN          NaN     NaN        NaN
1          NaN          NaN     NaN        NaN
2  Mandalorian  Disney Plus     1.0      Pedro
3          NaN          NaN     NaN        NaN

在上面的例子中,where()方法的主要任务是检查DataFrame的一个条件,即 "show = Mandalorian",并返回相应的输出。默认情况下,如果行不满足一个条件,它将被填充为NaN值。

在我们的结果DataFrame中,只有具有Mandalorian值的行被返回,而其他的值都是NaN。

Pandas系列,其中

让我们使用Python range()函数创建一个系列,并使用where条件来获取所需的值:

# app.py

import pandas as pd

s = pd.Series(range(5))
s.where(s > 2, inplace=True)
print(s)

输出结果

0    NaN
1    NaN
2    NaN
3    3.0
4    4.0
dtype: float64

如输出所示,不满足值>2的每一行都被替换为NaN

Pandas where:应用多个条件

要在pandas where()方法中应用多个条件,在条件之间使用&操作符。

如果一个条件失败,它将不会返回DataFrame的实际值。请看下面的代码:

# app.py

import pandas as pd

data = {'Show': ['Stranger Things', 'The X-Files', 'Mandalorian', 'The Boys'],
        'Streaming': ['Netflix', 'Fx', 'Disney Plus', 'Amazon Prime'],
        'Season': [3, 12, 1, 2],
        'Main Actor': ['Millie', 'Gillian', 'Padro', 'Karl Urban']}
df = pd.DataFrame.from_dict(data)

# filtering data
filter = df["Show"] == "Stranger Things"
filter2 = df["Season"] == 3

df.where(filter & filter2, inplace=True)
print(df)

输出

              Show Streaming  Season Main Actor
0  Stranger Things   Netflix     3.0     Millie
1              NaN       NaN     NaN        NaN
2              NaN       NaN     NaN        NaN
3              NaN       NaN     NaN        NaN

如果一个条件不满足,它将返回NaN值:

# app.py

import pandas as pd

data = {'Show': ['Stranger Things', 'The X-Files', 'Mandalorian', 'The Boys'],
        'Streaming': ['Netflix', 'Fx', 'Disney Plus', 'Amazon Prime'],
        'Season': [3, 12, 1, 2],
        'Main Actor': ['Millie', 'Gillian', 'Padro', 'Karl Urban']}
df = pd.DataFrame.from_dict(data)

# filtering data
filter = df["Show"] == "Stranger Things"
filter2 = df["Season"] == 12

df.where(filter & filter2, inplace=True)
print(df)

在这个例子中,第一个条件满足Show = Stranger Things,但是在filter2中,它不满足Stranger Things 节目有12季。

所以,它不会返回Stranger Things行和The X-Files行,因为这样第一个条件就不满足。所以,它将返回NaN值。

输出

   Show   Streaming  Season   Main Actor
0  NaN       NaN     NaN        NaN
1  NaN       NaN     NaN        NaN
2  NaN       NaN     NaN        NaN
3  NaN       NaN     NaN        NaN

你可以看到,由于一个条件的失败,它将返回一个有NaN值的DataFrame。

这就是Pandas DataFrame, where()函数的例子。