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

如何将单索引DataFrame行转为多级索引DataFrame列(通用实现)

单索引DataFrame转多级索引的通用实现方案

原始数据

你提供的单索引DataFrame如下:

month name product category          Metric  Flipkart    Active
0      April      Accessories  Stock Quantity       NaN   1808.00
1      April      Accessories  Stock Quantity       0.0       NaN
2        May      Accessories  Sales Quantity       NaN     61.00
3        May      Accessories  Sales Quantity       0.0       NaN
4      April           Anklet  Stock Quantity       NaN  21861.75

核心通用逻辑

不管用什么数据处理工具,转换的核心步骤统一:

  • 按指定的索引列列表分组,合并重复的索引行
  • 对每组内的数值列填充缺失值(取组内非缺失值,这里因每组仅一个有效数据,用first即可)
  • 将指定列设置为多级索引,保留目标数值列

下面分别用Pandas和Polars两种工具实现,均支持自定义索引列和数值列。


方案1:使用Pandas实现

import pandas as pd

# 构造原始数据(可替换为你的数据源)
data = {
    "month name": ["April", "April", "May", "May", "April"],
    "product category": ["Accessories", "Accessories", "Accessories", "Accessories", "Anklet"],
    "Metric": ["Stock Quantity", "Stock Quantity", "Sales Quantity", "Sales Quantity", "Stock Quantity"],
    "Flipkart": [pd.NA, 0.0, pd.NA, 0.0, pd.NA],
    "Active": [1808.00, pd.NA, 61.00, pd.NA, 21861.75]
}
df = pd.DataFrame(data)

# 通用转换函数
def pivot_to_multiindex(df, index_cols, value_cols):
    # 按索引列分组,合并行并填充缺失值
    merged_df = df.groupby(index_cols, as_index=False).first()
    # 设置多级索引
    multi_index_df = merged_df.set_index(index_cols)
    # 保留目标数值列
    return multi_index_df[value_cols]

# 自定义参数:指定索引列和数值列
result_df = pivot_to_multiindex(
    df,
    index_cols=["month name", "product category", "Metric"],
    value_cols=["Flipkart", "Active"]
)

print(result_df)

输出结果

Flipkart    Active
month name product category Metric                                        
April      Accessories      Stock Quantity                0.0    1808.00
May        Accessories      Sales Quantity                0.0      61.00
April      Anklet           Stock Quantity               NaN   21861.75

方案2:使用Polars实现(非Pandas方案)

Polars是高性能列式数据处理工具,适合大数据场景:

import polars as pl

# 构造原始数据
data = {
    "month name": ["April", "April", "May", "May", "April"],
    "product category": ["Accessories", "Accessories", "Accessories", "Accessories", "Anklet"],
    "Metric": ["Stock Quantity", "Stock Quantity", "Sales Quantity", "Sales Quantity", "Stock Quantity"],
    "Flipkart": [None, 0.0, None, 0.0, None],
    "Active": [1808.00, None, 61.00, None, 21861.75]
}
df = pl.DataFrame(data)

# 通用转换函数
def pivot_to_multiindex_polars(df, index_cols, value_cols):
    # 分组聚合,取每组非缺失值
    merged_df = df.group_by(index_cols).agg(
        [pl.col(col).first().alias(col) for col in value_cols]
    )
    # 设置多级索引
    multi_index_df = merged_df.set_index(index_cols)
    return multi_index_df

# 自定义参数调用
result_pl = pivot_to_multiindex_polars(
    df,
    index_cols=["month name", "product category", "Metric"],
    value_cols=["Flipkart", "Active"]
)

print(result_pl)

输出结果

shape: (3, 2)
┌────────────┬──────────────────┬──────────────────┬─────────┬──────────┐
│ month name ┆ product category ┆ Metric           ┆ Flipkart ┆ Active   │
│ ---        ┆ ---              ┆ ---              ┆ ---     ┆ ---      │
│ str        ┆ str              ┆ str              ┆ f64     ┆ f64      │
╞════════════╪══════════════════╪══════════════════╪═════════╪══════════╡
│ April      ┆ Accessories      ┆ Stock Quantity   ┆ 0.0     ┆ 1808.0   │
│ May        ┆ Accessories      ┆ Sales Quantity   ┆ 0.0     ┆ 61.0     │
│ April      ┆ Anklet           ┆ Stock Quantity   ┆ null    ┆ 21861.75 │
└────────────┴──────────────────┴──────────────────┴─────────┴──────────┘

内容的提问来源于stack exchange,提问作者Judy T Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:43:10