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

如何基于唯一/重复索引值重组Pandas DataFrame(增列/添行)?

嘿,我来帮你搞定这两个Pandas DataFrame的重组需求!先看你给出的示例代码,你已经创建了一个带有重复索引的DataFrame,接下来咱们分别解决两个场景的问题:

1. 基于重复索引创建新行(长格式重组)

如果你的原始数据是唯一索引、多列的宽格式,想要转成重复索引、单列/少列的长格式(把同一索引下的多列值拆成独立行),可以用melt()或stack()方法。举个例子:

假设你有这样的宽表:

import pandas as pd

# 模拟宽格式数据:每个values对应多个things值,存在不同列中
wide_df = pd.DataFrame({
    'values': [800.0, 400.0, 200.0],
    'things_1': [3.0621, 1.5309, 0.75],
    'things_2': [2.9066, 1.5860, 0.7945]
}).set_index('values')

要转成和你示例类似的重复索引长表,只需要:

# 转成长格式,保留索引
long_df = wide_df.melt(ignore_index=False).reset_index()
# 整理列名和顺序
long_df = long_df[['values', 'value']].rename(columns={'value': 'things'})

如果你的需求是筛选或保留已有重复索引的行,直接利用Pandas对重复索引的支持即可:

# 获取所有存在重复的索引对应的行(包含重复的所有实例)
duplicate_rows = tester[tester.index.duplicated(keep=False)]

2. 基于重复/唯一索引重组为更多列(宽格式转换)

这个场景是把重复索引的长格式转成唯一索引的宽格式,也就是把同一索引下的多个值放到不同列中。这里推荐用pivot()结合分组序号的方式,或者unstack()方法。

针对你的示例tester数据,具体操作如下:

# 给每个重复索引的条目添加一个递增序号,作为列的区分标识
tester['col_suffix'] = tester.groupby(level='values').cumcount()

# 转成宽格式
wide_tester = tester.pivot(index='values', columns='col_suffix', values='things')
# 重命名列名,让它更直观
wide_tester.columns = [f'things_{num+1}' for num in wide_tester.columns]
# 可选:把索引转为普通列
wide_tester.reset_index(inplace=True)

如果你喜欢更简洁的写法,也可以用unstack():

# 给原DataFrame添加一个多级索引(原索引+组内序号)
tester_multi = tester.set_index(tester.groupby(level='values').cumcount(), append=True)
# 把多级索引的第二级展开为列
wide_tester = tester_multi.unstack(level=1)
# 整理列名
wide_tester.columns = [f'things_{num+1}' for num in wide_tester.columns.get_level_values(1)]

另外,如果你只是想把同一索引下的所有值聚合到一个列表列中,也可以用groupby():

# 每个唯一values对应一个things列表
grouped_df = tester.groupby(level='values')['things'].apply(list).reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:49:46