通过对熊猫中给定的字典进行特定计算来创建新列

时间:2020-06-15 14:37:54

标签: pandas pandas-groupby

我有一个如下所示的数据框

Session     slot_num
s1          1
s1          2
s1          3
s1          4
s2          1
s2          2
s3          1
s3          2
s3          3

还有一本名为session_start_time的字典

session_start_time = {'s1':'2020-01-06 09:00:00','s2':'2020-08-06 06:00:00','s3':'2020-9-06 19:00:00'}

据此,我想在数据框下方进行准备

预期输出:

Session     slot_num   ideal_appt_time
s1          1          2020-01-06 09:00:00
s1          2          2020-01-06 09:20:00
s1          3          2020-01-06 09:40:00
s1          4          2020-01-06 10:00:00
s2          1          2020-08-06 06:00:00
s2          2          2020-08-06 06:20:00
s3          1          2020-09-06 19:00:00
s3          2          2020-09-06 19:20:00
s3          3          2020-09-06 19:40:00

说明: 从给定的字典中选择每个会话的开始时间,并保留该会话的第一个时段的时间,然后根据该会话的slot_number添加20分钟。

我尝试了以下代码:

counts = df.groupby('Session').cumcount()  
td = pd.to_timedelta(counts, unit='Min') * 20
df['ideal_appt_time'] = session_start_time[df.groupby('Session')] + td
# number the slot for each session
df['slot_num'] = counts + 1

1 个答案:

答案 0 :(得分:1)

Series.mapto_datetime一起用于日期时间序列,然后将转换后的列slot_num添加到to_timedelta的时间增量中,并减去1以{{1}开头},然后乘以0乘以20分钟:

20

如果无法使用列df['ideal_appt_time'] = (pd.to_datetime(df['Session'].map(session_start_time)) .add(pd.to_timedelta(df['slot_num'].sub(1).mul(20), unit='Min'))) print (df) Session slot_num ideal_appt_time 0 s1 1 2020-01-06 09:00:00 1 s1 2 2020-01-06 09:20:00 2 s1 3 2020-01-06 09:40:00 3 s1 4 2020-01-06 10:00:00 4 s2 1 2020-08-06 06:00:00 5 s2 2 2020-08-06 06:20:00 6 s3 1 2020-09-06 19:00:00 7 s3 2 2020-09-06 19:20:00 8 s3 3 2020-09-06 19:40:00 ,请对计数器使用GroupBy.cumcount作为替代解决方案:

slot_num