如何使用 pandas 进行数据过滤
在数据分析过程中,经常需要对数据进行筛选和过滤,以便专注于分析特定的数据子集。pandas 是一个强大的 Python 数据分析库,它提供了多种方法来过滤 DataFrame 中的数据。本文将详细介绍如何使用 pandas 进行数据过滤,包括使用条件表达式、查询方法和布尔索引等技术。
1. 使用条件表达式过滤数据
在 pandas 中,你可以使用条件表达式来过滤数据。这是最基本也是最直接的过滤数据的方法。
示例代码 1: 使用单个条件过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 过滤出年龄大于30的记录
filtered_df = df[df['Age'] > 30]
print(filtered_df)
Output:
示例代码 2: 使用多个条件过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 过滤出年龄大于25且名字以'C'开头的记录
filtered_df = df[(df['Age'] > 25) & (df['Name'].str.startswith('C'))]
print(filtered_df)
Output:
2. 使用 query()
方法过滤数据
query()
方法允许你使用字符串表达式来过滤数据,这使得语法更加简洁易读。
示例代码 3: 使用 query()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用 query 方法过滤出年龄大于30的记录
filtered_df = df.query('Age > 30')
print(filtered_df)
Output:
3. 使用布尔索引过滤数据
布尔索引是 pandas 中一种非常灵活的数据过滤方法,它允许你使用布尔向量来过滤数据。
示例代码 4: 使用布尔索引过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 创建一个布尔向量,表示年龄是否大于30
age_filter = df['Age'] > 30
# 使用布尔向量过滤数据
filtered_df = df[age_filter]
print(filtered_df)
Output:
4. 使用 isin()
方法过滤数据
isin()
方法允许你过滤出列中包含在指定列表中的值的所有记录。
示例代码 5: 使用 isin()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 过滤出名字在指定列表中的记录
name_filter = df['Name'].isin(['Alice', 'Charlie'])
filtered_df = df[name_filter]
print(filtered_df)
Output:
5. 使用 filter()
方法过滤数据
filter()
方法提供了一种便捷的方式来过滤 DataFrame 的行或列。
示例代码 6: 使用 filter()
方法过滤列
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 过滤出包含 'Name' 和 'Email' 的列
filtered_df = df.filter(items=['Name', 'Email'])
print(filtered_df)
Output:
示例代码 7: 使用 filter()
方法过滤行
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 过滤出索引为偶数的行
filtered_df = df.filter(like='0', axis=0)
print(filtered_df)
Output:
6. 使用 drop()
方法删除数据
虽然 drop()
方法通常用于删除数据,但它也可以间接用于过滤数据,通过删除不需要的部分来保留需要的数据。
示例代码 8: 使用 drop()
方法删除列
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 删除 'Age' 列
filtered_df = df.drop(columns=['Age'])
print(filtered_df)
Output:
示例代码 9: 使用 drop()
方法删除行
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 删除索引为1的行
filtered_df = df.drop(index=[1])
print(filtered_df)
Output:
7. 使用 loc
和 iloc
进行数据过滤
loc
和 iloc
是 pandas 中两个非常强大的数据选择方法,它们不仅可以用于数据选择,还可以用于数据过滤。
示例代码 10: 使用 loc
过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用 loc 过滤出年龄大于30的记录
filtered_df = df.loc[df['Age'] > 30]
print(filtered_df)
Output:
示例代码 11: 使用 iloc
过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用 iloc 过滤出前两行数据
filtered_df = df.iloc[0:2]
print(filtered_df)
Output:
8. 使用 where()
方法过滤数据
where()
方法在 pandas 中用于替换不满足条件的行或列,可以用来过滤数据。
示例代码 12: 使用 where()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用 where 方法过滤出年龄大于30的记录
filtered_df = df.where(df['Age'] > 30)
print(filtered_df)
Output:
9. 使用 mask()
方法过滤数据
mask()
方法与 where()
方法相反,它用于替换满足条件的行或列,可以用来过滤数据。
示例代码 13: 使用 mask()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com']}
df = pd.DataFrame(data)
# 使用 mask 方法过滤出年龄不大于30的记录
filtered_df = df.mask(df['Age'] > 30)
print(filtered_df)
Output:
10. 使用 select_dtypes()
方法过滤数据
select_dtypes()
方法允许你根据数据类型过滤 DataFrame 的列。
示例代码 14: 使用 select_dtypes()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com'],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 过滤出数值类型的列
filtered_df = df.select_dtypes(include=[np.number])
print(filtered_df)
11. 使用 eval()
方法过滤数据
eval()
方法在 pandas 中用于高效地评估字符串表达式,这些表达式涉及 DataFrame 中的列。
示例代码 15: 使用 eval()
方法过滤数据
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Email': ['alice@pandasdataframe.com', 'bob@pandasdataframe.com', 'charlie@pandasdataframe.com', 'david@pandasdataframe.com'],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 使用 eval 方法过滤出年龄大于30且薪水大于60000的记录
filtered_df = df.eval('Age > 30 and Salary > 60000')
print(filtered_df)
Output:
总结
在本文中,我们详细介绍了使用 pandas 进行数据过滤的多种方法,包括使用条件表达式、query()
方法、布尔索引、isin()
方法、filter()
方法、drop()
方法、loc
和 iloc
方法、where()
方法、mask()
方法、select_dtypes()
方法和 eval()
方法。通过这些方法,你可以灵活地选择和过滤 DataFrame 中的数据,以便进行进一步的数据分析和处理。