Python 根据随机选择的列生成随机天数
我有一个如下所示的数据帧。感谢SO社区对以下内容的帮助Python 根据随机选择的列生成随机天数,python,pandas,numpy,dataframe,pandas-groupby,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'
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\u days\u到上一年的rand值或从min\u days\u到下一年的rand值,创建一个名为rand\u number
col的新列
b) rand\u number
列的rand值基于以下两个条件
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) 我想提到的是,列的选择应该是随机的(例如:一些随机受试者的rand_值应该基于上一年的min_天
,而其他受试者的rand_值应该基于下一年的min_天
)
我在尝试下面的东西
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])
我希望我的输出如下所示
我将在[0,1]
上生成random,并相应缩放:
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
您可以尝试以下方法:
>>> import random
>>> rand_numbers = pd.Series(random.randint(*sorted((0, -1*i if random.choice((0,1)) else j))) for i,j in zip(df_offset.min_days_to_prev_year, df_offset.min_days_to_next_year))
>>> df_offset['rand_numbers'] = rand_numbers
>>> df_offset
person_id dates min_days_to_prev_year min_days_to_next_year rand_numbers
0 11 1961-12-30 363 1 -235
1 12 1967-05-29 148 216 168
2 13 1957-01-01 0 364 2
3 14 1959-07-27 207 157 132
啊,是的,但我试过10-15次处决。我只看到第一行的负值。。我可以确认其他行也可以有负值
吗?嗨,我只是想了解一下逻辑。我可以知道你为什么要做下一年的df_offset.min_days_to_+df_offset.min_days_to_prev_year)-df_offset.min_days_to_prev_year
然后乘以兰德吗?我们可以直接选择df\u offset.min\u days\u到下一年
,然后用rand乘以它?或者您首先乘以兰德,然后最后将min\u days\u减去上一年
,因为rand
介于(0,1)
之间。如果要将其缩放到(-a,b)
,正确的操作是rand*(b+a)-a
。您可以简单地用0
和1
替换rand
,以查看范围更改为-a,b
,如果括号是这样的(rand*(a+b))-a
,您不需要,请参见