如何在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
相关产品推荐
相关产品推荐

