以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.repeat
和cumcount
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
.
我还不能发表评论。所以我把它作为一个新的答案发布。