如何在Pandas中实现基于起始值与数量的数据展开逻辑?
Pandas实现按数量扩展行并生成连续编号的方案
方法1:使用repeat扩展行 + 分组计算编号
这种方法先按qty字段重复每行数据,再通过分组计算生成连续的number值:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'item id': [1], 'qty': [3], 'start': [1000], 'end': [1003] }) # 按qty重复每行数据 expanded_df = df.loc[df.index.repeat(df['qty'])] # 分组计算number:start值加上组内的行索引(从0开始) expanded_df['number'] = expanded_df.groupby('item id')['start'].transform( lambda x: x + pd.Series(range(len(x)), index=x.index) ) # 重置索引(可选,让索引连续) expanded_df = expanded_df.reset_index(drop=True) print(expanded_df)
输出结果:
item id qty start end number 0 1 3 1000 1003 1000 1 1 3 1000 1003 1001 2 1 3 1000 1003 1002
方法2:使用apply生成编号列表 + explode拆分多行
这种方法先为每行生成对应的编号列表,再将列表拆分成多行:
import pandas as pd df = pd.DataFrame({ 'item id': [1], 'qty': [3], 'start': [1000], 'end': [1003] }) # 为每行生成从start开始的连续qty个数字的列表 df['number'] = df.apply(lambda row: list(range(row['start'], row['start'] + row['qty'])), axis=1) # 将列表拆分成多行 expanded_df = df.explode('number', ignore_index=True) print(expanded_df)
输出结果与方法1完全一致。
补充说明
- 两种方法均采用Pandas的批量操作,避免了原生Python的手动循环,处理大规模数据时效率更高。
- 你提供的原生Python代码存在逻辑问题:
number = []放在循环内会每次清空列表,且np.append的语法错误;Pandas的方案无需这类手动循环逻辑,直接通过内置API实现需求。
内容的提问来源于stack exchange,提问作者Obvious Nchimunya Chilyabanyam
相关产品推荐
相关产品推荐

