如何使用 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:
在这个例子中,我们创建了一个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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘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:
在这个例子中,我们选择了 ‘A’ 列中值为 ‘foo’ 并且 ‘B’ 列中值为 ‘one’ 的所有行,并且将 ‘C’ 列的值增加 1。
总结起来,pandas dataframe loc
是一个非常强大的工具,它可以让我们根据行标签和列标签来获取数据,还可以根据多个条件进行筛选。在实际的数据分析中,我们经常需要根据多个条件来筛选数据,这时候就可以使用 loc
结合布尔索引来实现。