如何使用 pandas dataframe 的.loc属性来进行多条件筛选
参考:pandas dataframe loc with multiple conditions
在数据分析中,我们经常需要根据某些条件来筛选数据。Pandas 提供了一个非常强大的功能,那就是 .loc
属性,它可以让我们根据多个条件来选择数据。本文将详细介绍如何使用 pandas dataframe 的 .loc
属性来进行多条件筛选。
1. 基本使用
在开始之前,我们首先需要了解 .loc
属性的基本使用方法。.loc
是基于标签的数据选择方法,它可以接受的输入有:
- 单个标签。例如:5 或 ‘a’,这将会选择与指定标签相关的行或列。
- 标签列表。例如:[‘a’, ‘b’, ‘c’]。
- 切片对象。例如:’a’:’f’,注意,与 Python 切片不同,这里的切片包含末端。
- 布尔数组。
- 可返回标签的函数或参数。
下面我们创建一个简单的 dataframe 来演示:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
print(df)
Output:
我们可以使用 .loc
属性来选择所有名字为 ‘Tom’ 的行:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
df.loc[df['name'] == 'Tom']
print(df)
Output:
2. 多条件筛选
.loc
属性可以接受多个条件,这使得我们可以根据多个条件来筛选数据。例如,我们可以选择所有名字为 ‘Tom’ 并且年龄为 20 的行:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
print(df.loc[(df['name'] == 'Tom') & (df['age'] == 20)])
Output:
注意,每个条件都需要用括号括起来,条件之间使用 &
(和)或 |
(或)连接。
我们也可以使用 ~
来表示“非”,例如,选择所有名字不为 ‘Tom’ 的行:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
print(df.loc[~(df['name'] == 'Tom')])
Output:
3. 使用函数进行筛选
.loc
属性还可以接受一个函数,这使得我们可以使用复杂的逻辑来筛选数据。例如,我们可以选择所有分数在平均分以上的行:
df.loc[df['score'] > df['score'].mean()]
我们也可以定义一个函数,然后将这个函数作为条件传给 .loc
属性。例如,我们可以定义一个函数来选择所有名字包含 ‘pandasdataframe.com’ 的行:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
def contains_pandasdataframe_com(name):
return 'pandasdataframe.com' in name
print(df.loc[df['name'].apply(contains_pandasdataframe_com)])
Output:
4. 使用 .loc
属性修改数据
.loc
属性不仅可以用来选择数据,还可以用来修改数据。例如,我们可以将所有名字为 ‘Tom’ 的行的分数改为 100:
import pandas as pd
data = {
'name': ['Tom', 'Nick', 'John', 'Tom', 'John'],
'age': [20, 21, 19, 20, 18],
'score': [90, 85, 88, 92, 78]
}
df = pd.DataFrame(data)
print(df.loc[df['name'] == 'Tom', 'score'] = 100)
注意,这里我们使用了 .loc
属性的另一种形式:df.loc[row_indexer, column_indexer]
。这种形式可以让我们同时指定行和列。
5. 总结
Pandas 的 .loc
属性是一个非常强大的工具,它可以让我们根据多个条件来选择和修改数据。在实际的数据分析工作中,我们经常需要根据复杂的条件来筛选数据,.loc
属性可以让这个过程变得非常简单和直观。