如何使用 pandas dataframe loc来进行两个条件的筛选

如何使用 pandas dataframe loc来进行两个条件的筛选

参考:pandas dataframe loc 2 conditions

在数据分析中,我们经常需要根据一些条件来筛选数据。Pandas 提供了一种强大的索引方式,叫做 loc,它可以让我们根据行标签和列标签来获取数据。而当我们需要根据两个或者更多的条件来筛选数据时,我们可以使用 loc 结合布尔索引来实现。本文将详细介绍如何使用 pandas dataframe loc 来进行两个条件的筛选。

1. 基础知识

在开始之前,我们先来了解一下 pandas dataframe loc 的基础知识。

loc 是基于标签的数据选择方法,它可以接受的输入有:

  • 单个标签。例如:5 或 ‘a’,这将会用来查找列或者行。
  • 列表或者数组包含的标签。例如:[‘a’, ‘b’, ‘c’]。
  • 切片对象。例如:’a’:’f’。
  • 布尔数组。
  • 可返回标签的函数或者参数。

下面是一个基础的例子:

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 使用loc选择数据
print(df.loc[df['A'] == 'foo'])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们创建了一个dataframe,然后使用 loc 来选择 ‘A’ 列中值为 ‘foo’ 的所有行。

2. 使用 loc 进行两个条件的筛选

当我们需要根据两个条件来筛选数据时,我们可以使用 &(和)或者 |(或)来连接两个条件。下面是一些例子:

2.1 使用 & 连接两个条件

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的所有行
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one')])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行。

2.2 使用 | 连接两个条件

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 或者 'B' 列中值为 'one' 的所有行
print(df.loc[(df['A'] == 'foo') | (df['B'] == 'one')])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 或者 ‘B’ 列中值为 ‘one’ 的所有行。

3. 使用 loc 进行多个条件的筛选

当我们需要根据多个条件来筛选数据时,我们可以继续使用 &| 来连接条件。下面是一些例子:

3.1 使用 & 连接多个条件

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo', 'B' 列中值为 'one' 并且 'C' 列中值大于 2 的所有行
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one') & (df['C'] > 2)])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’, ‘B’ 列中值为 ‘one’ 并且 ‘C’ 列中值大于 2 的所有行。

3.2 使用 | 连接多个条件

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo', 'B' 列中值为 'one' 或者 'C' 列中值大于 2 的所有行
print(df.loc[(df['A'] == 'foo') | (df['B'] == 'one') | (df['C'] > 2)])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’, ‘B’ 列中值为 ‘one’ 或者 ‘C’ 列中值大于 2 的所有行。

4. 使用 loc 进行复杂的条件筛选

在某些情况下,我们可能需要进行更复杂的条件筛选,例如,我们可能需要选择 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 或者 ‘C’ 列中值大于 2 的所有行。在这种情况下,我们可以使用括号来改变条件的优先级。下面是一个例子:

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 或者 'C' 列中值大于 2 的所有行
print(df.loc[(df['A'] == 'foo') & ((df['B'] == 'one') | (df['C'] > 2))])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 或者 ‘C’ 列中值大于 2 的所有行。

5. 使用 loc 进行条件筛选和列选择

除了可以进行条件筛选,loc 还可以用来选择列。我们可以在 loc 后面的方括号中使用逗号来分隔行选择和列选择。下面是一些例子:

5.1 选择特定的列

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的所有行,并且只选择 'C' 和 'D' 列
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), ['C', 'D']])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行,并且只选择 ‘C’ 和 ‘D’ 列。

5.2 选择连续的列

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的所有行,并且选择 'C' 到 'E' 的所有列
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), 'C':'E'])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行,并且选择 ‘C’ 到 ‘E’ 的所有列。

总结起来,pandas dataframe loc 是一个非常强大的工具,它可以让我们根据行标签和列标签来获取数据,还可以根据多个条件进行筛选。在实际的数据分析中,我们经常需要根据多个条件来筛选数据,这时候就可以使用 loc 结合布尔索引来实现。

6. 使用 loc 进行条件筛选和行选择

除了可以进行条件筛选和列选择,loc 还可以用来选择行。我们可以在 loc 后面的方括号中使用逗号来分隔行选择和列选择。下面是一些例子:

6.1 选择特定的行

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的第1行和第3行,并且只选择 'C' 和 'D' 列
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), ['C', 'D']].iloc[[0, 2]])

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的第1行和第3行,并且只选择 ‘C’ 和 ‘D’ 列。

6.2 选择连续的行

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的第1行到第3行,并且选择 'C' 到 'E' 的所有列
print(df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), 'C':'E'].iloc[0:3])

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的第1行到第3行,并且选择 ‘C’ 到 ‘E’ 的所有列。

7. 使用 loc 进行条件筛选和赋值操作

loc 不仅可以用来选择数据,还可以用来进行赋值操作。下面是一些例子:

7.1 对选中的数据进行赋值

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的所有行,并且将 'C' 列的值设置为 0
df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), 'C'] = 0
print(df)

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行,并且将 ‘C’ 列的值设置为 0。

7.2 对选中的数据进行函数操作

import pandas as pd

# 创建一个dataframe
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
    'C': pd.Series(range(8), dtype='float32'),
    'D': pd.Timestamp('20130102'),
    'E': pd.Categorical(["test", "train", "test", "train", "test", "train", "test", "train"]),
    'F': 'pandasdataframe.com'
})

# 选择 'A' 列中值为 'foo' 并且 'B' 列中值为 'one' 的所有行,并且将 'C' 列的值增加 1
df.loc[(df['A'] == 'foo') & (df['B'] == 'one'), 'C'] += 1
print(df)

Output:

如何使用 pandas dataframe loc来进行两个条件的筛选

在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行,并且将 ‘C’ 列的值增加 1。

总结起来,pandas dataframe loc 是一个非常强大的工具,它可以让我们根据行标签和列标签来获取数据,还可以根据多个条件进行筛选。在实际的数据分析中,我们经常需要根据多个条件来筛选数据,这时候就可以使用 loc 结合布尔索引来实现。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程