根据条件将数据帧列拆分为不同的列

时间:2017-10-05 11:44:48

标签: python pandas

我有一个df

id   store_name   open_timings
1      abc        9 TO 1 -4 TO 11
2      bcd        8 TO 11 - 1 TO 3
3      xyz        8 TO 2
4      qwe        9 TO 2-4 TO 7

我想重新格式化这个df,这样我就创建了3列start_time,end_time,closed_time

id   store_name   start_time   end_time    closed_time
1      abc         9             11           1-4
2      bcd         8              3           11-1
3      xyz         8              2           None
4      qwe         9              7           2-4

如果可能的话,我可以用24小时格式转换这些列,就像这样。

id   store_name   start_time   end_time    closed_time
1      abc         9:00          11:00         13:00-16:00 
2      bcd         8:00          15:00         11:00 -13.00
3      xyz         8:00          14:00         nan
4      qwe         9:00          19:00         14:00-16:00 

第二部分是可选的,

有没有办法解决这个问题?

我可以通过

将列open_timings拆分为2
df['temp1'], df['temp'] = df['open_timings'].str.split('-', 1).str

但是不能过去。

1 个答案:

答案 0 :(得分:2)

你可以做str.split即

ndf = df['open_timings'].str.split('TO',expand=True).rename(columns={0:"start_time", 1:'closed_time' , 2:'end_time'})
af = pd.concat([df,ndf],1)
  id store_name      open_timings start_time closed_time end_time
0   1        abc   9 TO 1 -4 TO 11         9        1 -4        11
1   2        bcd  8 TO 11 - 1 TO 3         8      11 - 1         3
2   3        xyz            8 TO 2         8           2     None
3   4        qwe     9 TO 2-4 TO 7         9         2-4         7

要删除列,您可以执行af = af.drop(['open_timings'],1)

closed_time有一些含糊之处,但对start_timeend_time我们可以使用

for i in cols:   
    if i == 'start_time':
        hr = 0
    else:
        hr = 12
    af[i] = pd.to_datetime(af[i], format='%H')
    af[i] = af[i].apply(lambda x : np.where(pd.isnull(x),np.nan,"{}:{}".format(x.hour+hr,x.minute)))
    id store_name start_time closed_time end_time
0   1        abc        9:0       1 -4      23:0
1   2        bcd        8:0     11 - 1      15:0
2   3        xyz        8:0           2      nan
3   4        qwe        9:0        2-4      19:0