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

如何根据initial和final列规则重复Pandas DataFrame行?

问题与解决方案

初始DataFrame

>>> import pandas as pd
>>> d = {'n': ['one', 'two', 'three', 'four'],
         'initial': [3, 4, 10, 10],
         'final': [3, 7, 11, 7],}
>>> df = pd.DataFrame(d)
>>> df
       n  initial  final
0    one        3      3
1    two        4      7
2  three       10     11
3   four       10      7

需求说明

  • 当initial与final数值相同时,保留对应n值1次,新增count列值为该相同数值
  • 当final大于initial时,重复n值的次数为final - initial + 1,count列从initial递增到final
  • 当final小于initial时,丢弃该行对应的n值及相关数据

遇到的问题

曾尝试用reindex结合df.final - df.initial +1生成新索引,但无法处理final < initial导致的负数情况。

解决方案

import pandas as pd

d = {'n': ['one', 'two', 'three', 'four'],
     'initial': [3, 4, 10, 10],
     'final': [3, 7, 11, 7],}
df = pd.DataFrame(d)

# 过滤掉final小于initial的无效行
filtered_df = df[df['final'] >= df['initial']].copy()

# 为每行生成从initial到final的整数序列
filtered_df['count'] = filtered_df.apply(
    lambda row: list(range(row['initial'], row['final'] + 1)), axis=1
)

# 展开序列为多行,重置索引并清理多余列
result = filtered_df.explode('count', ignore_index=True).drop(columns=['initial', 'final'])

print(result)

代码逻辑说明

  1. 过滤无效行:先筛选出final >= initial的行,直接排除不需要保留的数据
  2. 生成count序列:通过apply遍历每行,用range生成从initial到final的整数列表,存入count列
  3. 展开数据:用explode将列表类型的count列拆分为多行,重置索引后移除原有的initial和final列,得到预期结果

运行后输出:

n  count
0    one      3
1    two      4
2    two      5
3    two      6
4    two      7
5  three     10
6  three     11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:05:38