如何使用 Pandas 来过滤 DataFrame 中的数据
在数据分析中,筛选和过滤数据是一个非常常见且重要的操作。Pandas 是 Python 中一个强大的数据处理库,它提供了多种方法来筛选 DataFrame 中的数据。本文将详细介绍如何使用 Pandas 来过滤 DataFrame 中的数据,并提供多个示例代码以帮助理解和应用。
1. 使用条件表达式过滤
在 Pandas 中,你可以使用条件表达式来过滤数据。这是最直接的过滤方式,可以根据一个或多个条件来筛选数据。
示例代码 1:单条件过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 过滤出 Website 列为 'pandasdataframe.com' 的行
filtered_df = df[df['Website'] == 'pandasdataframe.com']
print(filtered_df)
Output:
示例代码 2:多条件过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 过滤出 Website 列为 'pandasdataframe.com' 并且 Age 大于 30 的行
filtered_df = df[(df['Website'] == 'pandasdataframe.com') & (df['Age'] > 30)]
print(filtered_df)
Output:
2. 使用 query()
方法过滤
Pandas 的 query()
方法提供了一种更为简洁的方式来过滤 DataFrame。你可以在 query()
方法中直接使用字符串表达式来指定过滤条件。
示例代码 3:使用 query 过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 使用 query 方法过滤 Website 列为 'pandasdataframe.com'
filtered_df = df.query("Website == 'pandasdataframe.com'")
print(filtered_df)
Output:
3. 使用 isin()
方法过滤
当你需要根据列的值是否存在于某个列表中来过滤数据时,isin()
方法非常有用。
示例代码 4:使用 isin 过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 过滤出 Website 列的值在指定列表中的行
websites_to_filter = ['pandasdataframe.com', 'example.com']
filtered_df = df[df['Website'].isin(websites_to_filter)]
print(filtered_df)
Output:
4. 使用 filter()
方法过滤
Pandas 的 filter()
方法可以用来按照指定的轴和条件来过滤数据。这个方法主要用于选择列,而不是过滤行。
示例代码 5:使用 filter 过滤列
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 使用 filter 方法选择包含 'Name' 和 'Website' 的列
filtered_df = df.filter(items=['Name', 'Website'])
print(filtered_df)
Output:
5. 结合使用 loc
和 iloc
过滤
loc
和 iloc
是 Pandas 中用于基于标签或整数位置进行数据选择的方法。它们也可以用于数据过滤。
示例代码 6:使用 loc 过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 使用 loc 方法过滤出 Age 大于 30 的行
filtered_df = df.loc[df['Age'] > 30]
print(filtered_df)
Output:
示例代码 7:使用 iloc 过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 使用 iloc 方法选择前三行
filtered_df = df.iloc[:3]
print(filtered_df)
Output:
6. 使用布尔索引过滤
布尔索引是 Pandas 中一种非常灵活的数据过滤方式。你可以创建一个布尔序列来指定哪些行应该被选中。
示例代码 8:使用布尔索引过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 创建一个布尔序列
condition = (df['Website'] == 'pandasdataframe.com')
# 使用布尔索引过滤数据
filtered_df = df[condition]
print(filtered_df)
Output:
7. 使用 drop()
方法过滤
有时候,过滤数据不仅仅是选择符合条件的行,也可能涉及到删除某些不需要的行或列。drop()
方法可以用来删除 DataFrame 中的指定行或列。
示例代码 9:使用 drop 过滤行
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 删除第一行
filtered_df = df.drop(0)
print(filtered_df)
Output:
示例代码 10:使用 drop 过滤列
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 删除 'Age' 列
filtered_df = df.drop('Age', axis=1)
print(filtered_df)
Output:
示例代码 11:使用 notnull()
方法过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, None, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 过滤出 'Age' 列非空的行
filtered_df = df[df['Age'].notnull()]
print(filtered_df)
Output:
示例代码 12:使用 str.contains()
方法过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 过滤出 'Website' 列包含 'pandasdataframe.com' 的行
filtered_df = df[df['Website'].str.contains('pandasdataframe.com')]
print(filtered_df)
Output:
示例代码 13:使用 apply()
方法过滤
import pandas as pd
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Website': ['pandasdataframe.com', 'example.com', 'pandasdataframe.com', 'test.com']}
df = pd.DataFrame(data)
# 使用 apply 方法过滤出 'Age' 列大于 30 的行
filtered_df = df[df['Age'].apply(lambda x: x > 30)]
print(filtered_df)
Output: