You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中基于多列筛选并重塑水果价格数据集?

解决方案(无groupby实现)

假设你的DataFrame变量名为df,列名依次为年份、季度、水果名称、水果品种、单价,以下是分步实现方案:

步骤1:计算同水果同年同季度的单价均值

先通过组合标识列定位需要计算均值的分组,手动计算每个分组的均值并映射回原数据,最后去重得到唯一的年份-季度-水果均价数据:

import numpy as np
import pandas as pd

# 1. 创建组合标识列,定位同一水果、同年、同季度的分组
df['组合标识'] = df['年份'].astype(str) + '_' + df['季度'] + '_' + df['水果名称']

# 2. 手动计算每个组合的单价均值(避开groupby)
unique_combs = np.unique(df['组合标识'])
mean_price_map = {}
for comb in unique_combs:
    mean_price_map[comb] = df[df['组合标识'] == comb]['单价'].mean()

# 3. 映射均值并去重,保留唯一分组数据
df['均价'] = df['组合标识'].map(mean_price_map)
df_clean = df.drop_duplicates(subset=['组合标识']).drop(columns=['水果品种', '单价', '组合标识'])

步骤2:筛选2015-2017年每年都有4个季度数据的水果

通过透视表统计每个水果的有效年份-季度数量,筛选出数量为12(3年×4季度)的水果:

# 1. 过滤2015-2017年的数据
df_year_filtered = df_clean[(df_clean['年份'] >= 2015) & (df_clean['年份'] <= 2017)]

# 2. 创建透视表统计每个水果的有效年份-季度数(非空则计为1)
count_pivot = df_year_filtered.pivot(
    index='水果名称',
    columns=df_year_filtered['年份'].astype(str) + '_' + df_year_filtered['季度'],
    values='均价'
).notna().astype(int)

# 3. 筛选出有效年份-季度数为12的水果
valid_fruits = count_pivot[count_pivot.sum(axis=1) == 12].index.tolist()

# 4. 过滤得到符合条件的数据集
df_valid = df_year_filtered[df_year_filtered['水果名称'].isin(valid_fruits)]

步骤3:转换为宽表格式

通过透视表将长表转为宽表,把年份-季度作为列、水果名称作为行:

# 1. 创建年份-季度合并列
df_valid['年份季度'] = df_valid['年份'].astype(str) + '_' + df_valid['季度']

# 2. 转换为宽表
wide_table = df_valid.pivot(
    index='水果名称',
    columns='年份季度',
    values='均价'
).reset_index()

# 3. 清理列名索引
wide_table.columns.name = None

最终的wide_table就是你需要的结果:第一列为符合条件的水果名称,其余列为对应年份季度的价格。

内容的提问来源于stack exchange,提问作者funcard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:05:27