如何根据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)
代码逻辑说明
- 过滤无效行:先筛选出
final >= initial的行,直接排除不需要保留的数据 - 生成count序列:通过
apply遍历每行,用range生成从initial到final的整数列表,存入count列 - 展开数据:用
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
相关产品推荐
相关产品推荐

