如何复制Pandas DataFrame行并按规则递增调整ages列?
问题
我有一段代码能把Pandas DataFrame的每行随机复制1-3次,现在想给相同id_col的行更新ages列——新增行的年龄要在上一行的基础上加0.5到1之间的随机数,而且必须保持递增。原代码如下:
import numpy as np import pandas as pd np.random.seed(42) d = {'ages': [11,94,30,64,57,19, np.NaN], 'sex': [2,2,2,2,1,1,1]} df = ( pd .DataFrame(d) .dropna() .reset_index(drop = True) .assign(id_col = lambda x: x.index + 1) .loc[lambda x: x.index.repeat(np.random.uniform(1, 4, size = len(x)))] )
预期输出示例:
ages sex id_col 0 11.0 2 1 0 11.56 2 1 1 94.0 2 2 1 94.2 2 2 1 94.56 2 2 2 30.0 2 3 2 30.67 2 3 2 30.89 2 3 3 64.0 2 4 3 64.11 2 4 4 57.0 1 5 5 19.0 1 6
解决方案
你可以通过按id_col分组后,为每组生成递增的年龄序列来实现。核心逻辑是先确定每行的重复次数,再针对每个分组,以原始年龄为起点累加0.5-1之间的随机增量,生成符合要求的年龄序列。
修改后的代码如下:
import numpy as np import pandas as pd np.random.seed(42) d = {'ages': [11,94,30,64,57,19, np.NaN], 'sex': [2,2,2,2,1,1,1]} # 处理原始数据,生成带id_col的基础DataFrame df_raw = ( pd.DataFrame(d) .dropna() .reset_index(drop=True) .assign(id_col=lambda x: x.index + 1) ) # 生成1-3的整数重复次数(替换原代码的uniform,避免浮点数索引问题) repeat_counts = np.random.randint(1, 4, size=len(df_raw)) # 按次数重复行并重置索引 df_repeated = df_raw.loc[df_raw.index.repeat(repeat_counts)].reset_index(drop=True) # 定义分组生成递增年龄的函数 def generate_incremental_ages(group): base_age = group['ages'].iloc[0] # 生成对应数量的随机增量(数量为分组行数-1) increments = np.random.uniform(0.5, 1, size=len(group)-1) # 累加增量得到完整的年龄序列 age_sequence = np.concatenate([[base_age], base_age + np.cumsum(increments)]) group['ages'] = age_sequence return group # 分组处理生成最终结果 df_final = df_repeated.groupby('id_col', group_keys=False).apply(generate_incremental_ages) # 可选:保留两位小数匹配示例格式 df_final['ages'] = df_final['ages'].round(2) print(df_final)
关键说明
- 把原代码中
np.random.uniform(1,4)改为np.random.randint(1,4),确保重复次数是1、2、3的整数,避免浮点数索引导致的异常。 - 分组后以每组的第一个年龄为基数,用
np.cumsum()累加随机增量,保证年龄严格递增。 - 最后用
round(2)统一小数位数,和示例格式对齐,该步骤可根据需求选择是否保留。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

