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

时间:2019-04-06 22:51:06

标签: python python-3.x pandas datetime

以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

2 个答案:

答案 0 :(得分:4)

使用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_hourduration列具有数字而没有字符串。在您提供的MCVE中,您有字符串。如果是这种情况,请首先使用

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

答案 1 :(得分:0)

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

  

不是整数的持续时间应四舍五入到下一个整数(例如1.25应该取为2)

但是df.duration.round(0)的{​​{1}}是1.25,而不是1

我尚未被评论。因此,我将其发布为新答案。