Pandas - 将事件持续时间的每一小时转换为单独的行



以df开头的示例是:

import pandas as pd
df = pd.DataFrame({'event_id': ['123', '456'], 
'date': ['2018-01-01', '2018-01-01'], 
'start_hour' : ['10', '13'],
'duration' : ['1.5', '3']})
df
event_id        date start_hour duration
0      123  2018-01-01         10      1.5
1      456  2018-01-01         13        3

必要的输出是一个长 df,其中每小时发生一个事件就有一行。 不是整数的持续时间应向上舍入到下一个整数(例如,1.25 应变为 2)

例:

result_df = pd.DataFrame({'event_id': ['123', '123', '456', '456', '456'], 
'date': ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01'], 
'hour' : ['10', '11', '13', '14', '15']})
result_df
event_id        date hour
0      123  2018-01-01   10
1      123  2018-01-01   11
2      456  2018-01-01   13
3      456  2018-01-01   14
4      456  2018-01-01   15

使用np.repeatcumcount

df = pd.DataFrame({col: np.repeat(df[col], np.ceil(df.duration))) for col in df.columns})
df['start_hour'] += df.groupby('event_id').start_hour.cumcount()

输出

event_id    date        start_hour  
0   123         2018-01-01  10         
0   123         2018-01-01  11         
1   456         2018-01-01  13         
1   456         2018-01-01  14         
1   456         2018-01-01  15         

这一切都假设您的start_hour列和duration列有数字而不是字符串。在您提供的 MCVE 中,您有字符串。如果是这种情况,请首先使用

df['duration'] = pd.to_numeric(df['duration'])

接受的答案不正确。TO要求:

不是整数的持续时间应向上舍入到下一个整数(例如,1.25 应变为 2)

但对1.25来说df.duration.round(0)1而不是2.

我还不能发表评论。所以我把它作为一个新的答案发布。

最新更新