如何基于DataFrame列值差重复行并添加递增列value3?
解决DataFrame按指定差值重复行并添加递增列的问题
我来帮你搞定这个需求!先理清楚你的核心需求:根据value到value2的连续整数个数重复每行,同时给重复的行加上从value开始递增到value2的value3列。你的尝试方向是对的,但用groupby.apply + pd.concat确实会有索引和顺序的问题,而且添加value3也不够直观,这里给你一个更简洁高效的实现方式。
先明确原始数据和目标
首先我们把原始数据明确下来(方便复现):
import pandas as pd df = pd.DataFrame({ 'class1': [1,2,2,3], 'class2': [0,1,0,1], 'value': [1,2,3,4], 'value2': [4,3,5,6] })
原始结构:
class1 class2 value value2 0 1 0 1 4 1 2 1 2 3 2 2 0 3 5 3 3 1 4 6
目标是把每行重复value2 - value + 1次,同时给每组重复行加上从value到value2的递增value3。
优雅的实现方案
直接用向量化操作来实现,避免低效的循环和分组拼接,步骤如下:
计算每行的重复次数:
重复次数就是value2 - value + 1,比如第一行4-1+1=4,对应重复4次。重复行得到展开的DataFrame:
用df.index.repeat()来生成重复的索引,再通过loc获取展开后的行,最后重置索引避免多层索引问题。生成
value3列:
针对每一行,value3是从value到value2的连续整数,我们可以直接为每行生成这个整数数组,再拼接起来赋值给value3列。
完整代码如下:
import pandas as pd import numpy as np # 初始化原始DataFrame df = pd.DataFrame({ 'class1': [1,2,2,3], 'class2': [0,1,0,1], 'value': [1,2,3,4], 'value2': [4,3,5,6] }) # 1. 计算每行需要重复的次数 repeat_counts = df['value2'] - df['value'] + 1 # 2. 重复行,得到展开后的DataFrame df_expanded = df.loc[df.index.repeat(repeat_counts)].reset_index(drop=True) # 3. 生成value3:为每行生成从value到value2的整数数组,再拼接 value3_arrays = [np.arange(row.value, row.value2 + 1) for _, row in df.iterrows()] df_expanded['value3'] = np.concatenate(value3_arrays) # 查看结果 print(df_expanded)
运行后就能得到你想要的结果:
class1 class2 value value2 value3 0 1 0 1 4 1 1 1 0 1 4 2 2 1 0 1 4 3 3 1 0 1 4 4 4 2 1 2 3 2 5 2 1 2 3 3 6 2 0 3 5 3 7 2 0 3 5 4 8 2 0 3 5 5 9 3 1 4 6 4 10 3 1 4 6 5 11 3 1 4 6 6
进阶优化:完全向量化实现(更大数据量适用)
如果你的数据量特别大,还可以把生成value3的部分改成完全向量化的方式,避免iterrows(),性能会更优:
# 完全向量化生成value3 df_expanded['value3'] = df['value'].repeat(repeat_counts).values + np.concatenate([np.arange(n) for n in repeat_counts])
这个写法先把value按重复次数展开,再给每个组内的行加上从0开始的递增数,最终得到从value到value2的序列,逻辑和之前一致,但性能更出色。
内容的提问来源于stack exchange,提问作者giser_yugang
相关产品推荐
相关产品推荐

