python - 根据随机选择的列生成随机天数

标签 python pandas numpy dataframe pandas-groupby

我有一个如下所示的数据框。感谢 SO 社区在以下方面提供的帮助

df1 = pd.DataFrame({'person_id': [11,11, 12, 13, 14],
                        'date_birth': ['01/01/1961','12/30/1961', '05/29/1967', '01/01/1957', '7/27/1959']})
df1 = df1.melt('person_id', value_name='dates')
df1['dates'] = pd.to_datetime(df1['dates'])
df_ranges = df1.assign(until_prev_year_days=(df1['dates'].dt.dayofyear - 1),
     until_next_year_days=((df1['dates'] + pd.offsets.YearEnd(0)) - df1['dates']).dt.days)
f = {'until_prev_year_days': 'min', 'until_next_year_days': 'min'}

min_days = df_ranges.groupby('person_id',as_index=False).agg(f)
min_days.columns = ['person_id','min_days_to_prev_year','min_days_to_next_year']
df_offset = pd.merge(df_ranges[['person_id','dates']], min_days, on='person_id',how='inner')

我想做的是

a) 根据 min_days_to_prev_yearmin_days_to_next_year cols 中的 rand 值创建一个名为 rand_number col 的新列

b) rand_number 列的 rand 值基于以下 2 个条件

     a) rand_value from `min_days_to_prev_year` - `range is 0 to -N` (ex: 0 to -363 for person 11)
     b) rand_value from `min_days_to_next_year` - `range is 0 to +N` (ex: 0 to +1 for person 11)

It's possible that both columns have `0` as value, then we just take 0. 

c) 想要提一下,列的选择应该是随机的(例如:一些随机受试者应该具有基于 min_days_to_prev_year 的 rand_value,而另一些则基于 min_days_to_next_year)

我正在尝试类似下面的事情

df_offset['rand_number'] = np.random.randint(df_offset['min_days_to_prev_year'].astype(int),df_offset['min_days_to_next_year'].astype(int), df_offset.shape[0])

我希望我的输出如下所示

enter image description here

最佳答案

我会在[0,1]上生成随机数并相应地缩放:

np.random.seed(10)
rand = np.random.random(len(df_offset))

df_offset['rand_number'] = (rand * (df_offset.min_days_to_next_year + df_offset.min_days_to_prev_year) 
                                 -  df_offset.min_days_to_prev_year
                           ).astype(int)

输出:

      person_id  dates                  min_days_to_prev_year    min_days_to_next_year    rand_number
--  -----------  -------------------  -----------------------  -----------------------  -------------
 0           11  1961-12-30 00:00:00                      363                        1            -82
 1           12  1967-05-29 00:00:00                      148                      216           -140
 2           13  1957-01-01 00:00:00                        0                      364            230
 3           14  1959-07-27 00:00:00                      207                      157             65

关于python - 根据随机选择的列生成随机天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62535573/

相关文章:

python - 从python中的对数正态分布生成随机数

python - 用 python 抓取图像但找不到图像

python - 当我写入 CSV 时,如何隐藏 pandas to_datetime NaT?

python - Beautiful Soup 和 Pandas 提取物编号

python - 努巴。如何使用元组轴参数编写 np.sum ?

python - 在掩码数组中查找出现频率最高的元素

python - 如何在 cython 中声明一个全局 numpy.ndarray?

python - 尝试在 Python 中列出 ftp 目录时出现 OSError

pandas - 如何使用正则表达式在 Pandas 数据框中选择一行和包含特定子字符串的行后面的固定行数

numpy - 阅读旧的 Numarray 教程和示例需要注意什么?