Pandas如何使用loc方法结合多个条件来筛选 DataFrame 中的数据
参考:pandas dataframe loc with multiple conditions
在数据分析和数据处理中,Pandas 是 Python 中最受欢迎的库之一。Pandas 提供了 DataFrame 对象,这是一个强大的二维数据结构,类似于 Excel 表格。使用 DataFrame,我们可以轻松地读取、修改、筛选和处理数据。在本文中,我们将详细探讨如何使用 loc
方法结合多个条件来筛选 DataFrame 中的数据。
1. 基本使用
loc
方法是 Pandas 中用于选择数据的主要方法之一。它允许我们通过标签选择数据,也可以结合多个条件进行选择。在使用 loc
时,我们可以传递单个标签、标签列表、切片、布尔数组等。
示例代码 1: 创建 DataFrame
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
print(df)
Output:
示例代码 2: 使用单个条件筛选
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[df['Age'] > 30]
print(result)
Output:
示例代码 3: 使用多个条件筛选
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'] > 30) & (df['City'] == 'Chicago')]
print(result)
Output:
2. 结合多个条件
当我们需要根据多个条件筛选数据时,可以使用逻辑运算符,如 &
(和), |
(或), ~
(非) 来组合条件。
示例代码 4: 使用 AND 条件
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'] > 30) & (df['City'] == 'Houston')]
print(result)
Output:
示例代码 5: 使用 OR 条件
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'] > 30) | (df['City'] == 'New York')]
print(result)
Output:
示例代码 6: 使用 NOT 条件
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[~(df['City'] == 'Phoenix')]
print(result)
Output:
3. 使用切片与条件
我们不仅可以使用条件,还可以结合切片来选择数据。
示例代码 7: 结合切片和条件
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[2:4, (df.columns == 'Name') | (df.columns == 'City')]
print(result)
Output:
4. 使用函数定义条件
有时候,我们的筛选条件可能比较复杂,可以使用函数来定义这些条件。
示例代码 8: 使用自定义函数
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
def custom_condition(x):
return x['Age'] > 35 and x['City'].startswith('H')
result = df.loc[df.apply(custom_condition, axis=1)]
print(result)
Output:
5. 修改选中的数据
使用 loc
不仅可以选择数据,还可以修改选中的数据。
示例代码 9: 修改选中的数据
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
df.loc[df['Age'] > 40, 'City'] = 'San Francisco'
print(df)
Output:
6. 复杂的条件组合
在实际应用中,我们可能需要根据多个复杂的条件来筛选数据。
示例代码 10: 复杂条件组合
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'] > 25) & (df['City'].isin(['New York', 'Los Angeles'])) & (df['Name'].str.contains('pandasdataframe.com'))]
print(result)
Output:
示例代码 11: 更复杂的条件组合
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'].between(30, 40)) & (df['City'].str.endswith('s'))]
print(result)
Output:
7. 使用 query 方法
除了 loc
,Pandas 还提供了 query
方法,可以使用字符串形式的表达式来筛选数据,这在某些情况下可以使代码更简洁。
示例代码 12: 使用 query 方法
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.query('Age > 30 & City == "Chicago"')
print(result)
Output:
8. 性能考虑
当处理大规模数据时,性能成为一个重要的考虑因素。使用 loc
与多条件筛选时,应尽可能优化条件表达式,避免不必要的计算。
示例代码 13: 性能优化
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
result = df.loc[(df['Age'] > 30) & (df['City'].str.contains('pandasdataframe.com'))]
print(result)
Output:
9. 结合 groupby 使用
在使用 loc
进行数据筛选后,我们可能需要对筛选后的数据进行分组统计。
示例代码 14: 结合 groupby 使用
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
filtered = df.loc[df['Age'] > 30]
grouped = filtered.groupby('City').mean()
print(grouped)
10. 结合 merge 使用
筛选数据后,我们可能需要将筛选后的数据与其他数据进行合并。
示例代码 15: 结合 merge 使用
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [25, 30, 35, 40, 45],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix']
}
df = pd.DataFrame(data)
filtered = df.loc[df['Age'] > 30]
other_data = pd.DataFrame({'City': ['New York', 'Chicago'], 'Population': [8000000, 2700000]})
merged = pd.merge(filtered, other_data, on='City')
print(merged)
Output:
通过上述示例,我们可以看到 loc
方法在结合多个条件进行数据筛选时的强大功能。在实际应用中,根据数据的具体情况和需求,合理使用 loc
可以帮助我们高效地处理数据。