当前数据框:
Account_ID Transaction_Type Transaction_Date
0 10001 B
1 10001 B
2 10001 B
3 10001 B
4 10002 D
5 10002 D
6 10002 D
7 10003 F
8 10003 F
9 10004 H
我正在尝试在'2018-06-30'到'2018-11-30'的范围内创建随机的'交易日期',该日期针对“帐户ID”组进行了排序。对于每组“帐户ID”,随机日期应考虑指定的范围。
预期输出:
Account_ID Transaction_Type Transaction_Date
0 10001 B 2018-06-30
1 10001 B 2018-07-15
2 10001 B 2018-07-22
3 10001 B 2018-09-14
4 10002 D 2018-07-02
5 10002 D 2018-07-29
6 10002 D 2018-10-20
7 10003 F 2018-07-07
8 10003 F 2018-11-11
9 10004 H 2018-06-30
我正在尝试以下逻辑。
在accountid上进行分组,获取每个组的计数,使用每个组的计数样本在上述范围内生成随机日期列表,并使用loc将列表元素分配给“ Transaction_Date”系列。 有更好的方法请提出建议。谢谢!
答案 0 :(得分:0)
我将定义一个自定义函数,并将其与groupby().transform
一起应用。该函数执行以下操作:
1:获取开始日期和结束日期之间的天数
2:获取 n 个随机整数( n 是每个组的大小,整数代表开始日期之后的天数),并对它们进行排序>
3:将这些随机整数作为天的时间增量添加到开始日期。
start_date = pd.to_datetime('2018-06-30')
end_date = pd.to_datetime('2018-11-30')
def gen_rand_date(group, start_date = start_date, end_date = end_date):
# step 1 in description above:
days = (end_date - start_date).days
# step 2:
d = pd.np.sort(pd.np.random.choice(range(days), len(group)))
# step 3:
return start_date + pd.to_timedelta(d,unit='D')
df['Transaction_Date'] = df.groupby('Account_ID').transform(lambda x: gen_rand_date(x))
>>> df
Account_ID Transaction_Type Transaction_Date
0 10001 B 2018-07-19
1 10001 B 2018-08-12
2 10001 B 2018-08-27
3 10001 B 2018-09-29
4 10002 D 2018-10-23
5 10002 D 2018-11-09
6 10002 D 2018-11-14
7 10003 F 2018-08-03
8 10003 F 2018-09-10
9 10004 H 2018-09-16