基于列值扩展Pandas DataFrame行的Python实现需求
基于DataFrame的index_end列扩展数据集
初始数据
| item | index_end |
|---|---|
| A | 3 |
| B | 4 |
| C | 1 |
目标效果
需要将每个item对应的行,按照index_end的数值扩展为从1到该数值的多行,并新增index列记录分区内的连续索引,最终结果如下:
| item | index_end | index |
|---|---|---|
| A | 3 | 1 |
| A | 3 | 2 |
| A | 3 | 3 |
| B | 4 | 1 |
| B | 4 | 2 |
| B | 4 | 3 |
| B | 4 | 4 |
| C | 1 | 1 |
Pandas解决方案
方法1:apply生成序列 + explode展开
先为每行生成从1到index_end的列表,再用explode将列表拆分为多行:
import pandas as pd # 构造初始DataFrame df = pd.DataFrame({'item': ['A', 'B', 'C'], 'index_end': [3, 4, 1]}) # 为每行生成index序列,再展开 df['index'] = df['index_end'].apply(lambda x: list(range(1, x+1))) df = df.explode('index', ignore_index=True)
方法2:repeat重复行 + groupby生成索引
先按index_end的值重复对应行,再分组生成连续索引:
import pandas as pd df = pd.DataFrame({'item': ['A', 'B', 'C'], 'index_end': [3, 4, 1]}) # 按index_end重复每行 df_expanded = df.loc[df.index.repeat(df['index_end'])] # 分组后生成从1开始的连续索引 df_expanded['index'] = df_expanded.groupby(level=0).cumcount() + 1 df_expanded = df_expanded.reset_index(drop=True)
方法3:构造多级索引转换
通过构建item和index的多级索引,再转换为目标DataFrame:
import pandas as pd df = pd.DataFrame({'item': ['A', 'B', 'C'], 'index_end': [3, 4, 1]}) # 生成所有(item, index)的元组对 index_tuples = [] for _, row in df.iterrows(): index_tuples.extend([(row['item'], idx) for idx in range(1, row['index_end'] + 1)]) # 转换为多级索引并生成DataFrame multi_idx = pd.MultiIndex.from_tuples(index_tuples, names=['item', 'index']) df_result = pd.DataFrame(index=multi_idx).reset_index() # 合并原数据的index_end列 df_result = df_result.merge(df, on='item')
内容的提问来源于stack exchange,提问作者Hari Shreyas
相关产品推荐
相关产品推荐

