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

如何复制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:07:28