如何基于唯一/重复索引值重组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
相关产品推荐
相关产品推荐

