1. Pandas DataFrame
数据筛选与过滤 基础
Pandas 中的数据筛选与过滤是一个常用操作,可以帮助你根据某些条件选择符合要求的数据。以下是关于 Pandas DataFrame
数据筛选与过滤的详细讲解。
1. 按列筛选
可以通过列名来选择 DataFrame
中的特定列。
import pandas as pd
# 创建一个简单的 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
})
# 选择列 'A' 和 'B'
df_filtered = df[['A', 'B']]
print(df_filtered)
2. 按条件筛选行
可以根据条件筛选符合要求的行,条件可以是数值、字符串或布尔表达式。
2.1 按数值条件筛选
例如,选择列 A
中大于 2 的所有行:
df_filtered = df[df['A'] > 2]
print(df_filtered)
2.2 使用多个条件筛选
可以使用逻辑运算符(&
表示与,|
表示或,~
表示非)来连接多个条件。
df_filtered = df[(df['A'] > 2) & (df['B'] < 8)]
print(df_filtered)
注意:在多个条件中,必须将每个条件用括号括起来。
2.3 按字符串条件筛选
你还可以根据列中的字符串内容进行筛选,例如选择列 C
中包含“1”的行:
df_filtered = df[df['C'].astype(str).str.contains('1')]
print(df_filtered)
3. 按位置筛选行和列
3.1 使用 .iloc[]
根据位置筛选
iloc[]
用于按位置筛选数据,它接受行和列的索引位置。
# 选择第 1 行到第 2 行,和第 1 列到第 2 列
df_filtered = df.iloc[0:2, 0:2]
print(df_filtered)
3.2 使用 .loc[]
根据标签筛选
loc[]
用于根据标签选择数据,既可以选择行标签,也可以选择列标签。
# 选择行标签为 0 和 1,列标签为 'A' 和 'B'
df_filtered = df.loc[0:1, ['A', 'B']]
print(df_filtered)
4. 按索引筛选
如果你想通过 DataFrame
的索引进行筛选,可以使用 .index
或 .loc[]
:
df_filtered = df[df.index % 2 == 0] # 选择偶数行
print(df_filtered)
5. 缺失值筛选
Pandas 提供了一些方法来筛选缺失值(NaN
):
5.1 选择缺失值
df_filtered = df[df['A'].isnull()]
print(df_filtered)
5.2 选择非缺失值
df_filtered = df[df['A'].notnull()]
print(df_filtered)
6. 使用 query()
筛选
query()
允许你使用字符串表达式进行筛选,语法类似 SQL。
df_filtered = df.query('A > 2 and B < 8')
print(df_filtered)
7. 根据值的唯一性筛选
如果你希望选择具有唯一值的行,可以使用 drop_duplicates()
来去除重复行。
df_filtered = df.drop_duplicates(subset=['A'])
print(df_filtered)
8. 按条件替换值
除了筛选外,你还可以根据条件修改 DataFrame
中的数据。
df.loc[df['A'] > 2, 'A'] = 99 # 将 'A' 列中大于 2 的值替换为 99
print(df)
总结
Pandas 提供了多种灵活的方式来筛选、过滤和修改数据,常见的方法包括基于列选择、条件筛选、位置筛选、索引筛选以及查询等。根据具体的需求,选择适合的方法来进行数据处理。
2. Pandas DataFrame
数据筛选与过滤 综合实战
在本节中,我们将结合多个条件进行一个实际的 Pandas 数据筛选与过滤的综合实战,使用一个较为复杂的 DataFrame
来演示筛选、过滤、条件处理等操作。我们将使用一个虚拟的销售数据来说明如何利用 Pandas 进行不同类型的筛选和数据处理。
示例数据
假设我们有一个如下的销售数据 DataFrame
,记录了不同产品的销量、价格、折扣信息,以及销售日期。
import pandas as pd
# 创建一个销售数据的 DataFrame
data = {
'Product': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
'Sales': [150, 200, 180, 300, 220, 250, 190, 320, 270, 310],
'Price': [15.5, 25.0, 35.0, 12.0, 40.0, 30.5, 22.5, 50.0, 60.0, 55.0],
'Discount': [0.1, 0.2, 0.15, 0.05, 0.1, 0.25, 0.3, 0.2, 0.1, 0.05],
'Date': pd.to_datetime([
'2025-01-01', '2025-01-02', '2025-01-03', '2025-01-04', '2025-01-05',
'2025-01-06', '2025-01-07', '2025-01-08', '2025-01-09', '2025-01-10'
])
}
df = pd.DataFrame(data)
print(df)
1. 根据价格筛选销量最高的产品
假设我们想筛选出价格大于 30 的所有产品,并查看这些产品的销量。
df_filtered = df[df['Price'] > 30]
print(df_filtered[['Product', 'Price', 'Sales']])
2. 根据销售额计算筛选出利润较高的产品
我们可以通过计算销售额(Price * Sales
)来筛选出销售额大于 6000 的产品。
df['Revenue'] = df['Price'] * df['Sales']
df_high_revenue = df[df['Revenue'] > 6000]
print(df_high_revenue[['Product', 'Revenue']])
3. 选择折扣较大的产品
假设我们想筛选出折扣大于 0.2 的所有产品,并且按销量降序排序。
df_discounted = df[df['Discount'] > 0.2].sort_values(by='Sales', ascending=False)
print(df_discounted[['Product', 'Discount', 'Sales']])
4. 在指定日期范围内筛选产品
我们可以根据 Date
列筛选出在 2025 年 1 月 5 日至 1 月 8 日之间的所有产品。
df_date_filtered = df[(df['Date'] >= '2025-01-05') & (df['Date'] <= '2025-01-08')]
print(df_date_filtered[['Product', 'Date']])
5. 按多个条件筛选产品
如果我们想筛选出销量大于 200 且价格大于 30 的产品,可以通过以下方式实现:
df_filtered_multiple = df[(df['Sales'] > 200) & (df['Price'] > 30)]
print(df_filtered_multiple[['Product', 'Sales', 'Price']])
6. 筛选销量前 3 的产品
我们可以使用 nlargest()
函数筛选出销量排名前三的产品。
top_sales = df.nlargest(3, 'Sales')
print(top_sales[['Product', 'Sales']])
7. 根据多个条件计算并筛选
我们可以计算折扣后的销售价格,并根据折扣后的价格筛选出低于 25 的产品。
df['Discounted_Price'] = df['Price'] * (1 - df['Discount'])
df_filtered_price = df[df['Discounted_Price'] < 25]
print(df_filtered_price[['Product', 'Discounted_Price']])
8. 删除重复的产品记录
假设我们的数据集中有重复的产品信息,我们可以使用 drop_duplicates()
来删除这些重复的行。
df_duplicate = df.append(df) # 故意创建重复数据
df_no_duplicates = df_duplicate.drop_duplicates(subset=['Product'])
print(df_no_duplicates[['Product', 'Sales']])
9. 根据缺失数据筛选
假设某些产品的销量信息丢失(NaN
),我们可以筛选出缺失销量信息的产品。
df_with_missing_sales = df.copy()
df_with_missing_sales.loc[2, 'Sales'] = None # 人为引入缺失数据
df_missing_sales = df_with_missing_sales[df_with_missing_sales['Sales'].isnull()]
print(df_missing_sales[['Product', 'Sales']])
总结
通过这几个综合案例,我们展示了如何利用 Pandas 对 DataFrame
进行多种筛选与过滤操作,涉及数值比较、日期范围筛选、多条件组合、排序、去重等技巧。掌握这些基本操作后,你可以处理更复杂的筛选需求和数据处理任务。