以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
答案 0 :(得分:4)
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'])
答案 1 :(得分:0)
接受的答案不正确。 TO要求:
不是整数的持续时间应四舍五入到下一个整数(例如1.25应该取为2)
但是df.duration.round(0)
的{{1}}是1.25
,而不是1
。
我尚未被评论。因此,我将其发布为新答案。