Как разделить столбец после поворота таблицы?

#python-3.x #pandas #pivot

#python-3.x #pandas #поворот

Вопрос:

У меня есть набор данных, который изначально выглядит следующим образом

 ContextID   VariableID  Timestamp   Timestampms Value
    7304693 516 2018-07-11 10:49:36 153 1.00000001335143e-10
    7304693 516 2018-07-11 10:49:36 291 1.00000001335143e-10
    7304693 516 2018-07-11 10:49:36 455 1.00000001335143e-10
    7304693 517 2018-07-11 10:49:36 153 0.00266113295219839
    7304693 517 2018-07-11 10:49:36 291 0.00266113295219839
    7304693 517 2018-07-11 10:49:36 455 0.00236816401593387
    7304693 517 2018-07-11 10:49:36 483 0.00236816401593387
  

Я хотел преобразовать набор данных для создания VariableID отдельных столбцов, для которых мне пришлось объединить Timestamp и Timestampms для создания уникальных значений, и я сделал это с помощью

 data = pd.read_excel('Book1.xlsx', header = 0, parse_dates = [['Timestamp', 'Timestampms']])
data = data.rename(columns={'Timestamp_Timestampms': 'Time'})
data = data.pivot(index= 'Time', columns='VariableID', values='Value')
data = data.reset_index(level=0)
  

и получил следующий фрейм данных

 Time                        516                           517    
2018-07-11 10:49:36 153 1.00000001335143e-10    0.00266113295219839
2018-07-11 10:49:36 291 1.00000001335143e-10    0.00266113295219839
2018-07-11 10:49:36 455 1.00000001335143e-10    0.00236816401593387
2018-07-11 10:49:36 483     nan                 0.00236816401593387
  

Теперь я хотел бы получить некоторую помощь относительно того, как я могу разделить Time столбец на 2 разных столбца. Первый столбец содержит только дату, а второй столбец содержит время, за которым следуют другие столбцы, такие как 516 и 517 .

 Date          Time_ms
2018-07-11  10:49:36_153
2018-07-11  10:49:36_291
2018-07-11  10:49:36_455
2018-07-11  10:49:36_483
2018-07-11  10:49:36_578
  

Кроме того, я хотел бы установить ContextID столбец из исходной таблицы в качестве индекса для сводной таблицы и хотел бы знать, как это можно сделать?

Заранее спасибо

Ответ №1:

Используйте Series.str.split с помощью Series.str.replace :

 data = data.rename(columns={'Timestamp_Timestampms': 'Time'})
#added ContextID column
data = data.set_index(['ContextID','Time','VariableID'])['Value'].unstack()
data = data.reset_index()

data[['Time','Time_ms']] = data.Time.str.split(n=1, expand=True)
#python separator for ms is . (altarnative solution)
#data['Time_ms'] = data['Time_ms'].str.replace('s ', '.')
data['Time_ms'] = data['Time_ms'].str.replace('s ', '_')

c = ['ContextID','Time','Time_ms']
data = data[c   data.columns.difference(c).tolist()]
data = data.rename_axis(None, axis=1)
print (data)
   ContextID        Time       Time_ms           516       517
0    7304693  2018-07-11  10:49:36_153  1.000000e-10  0.002661
1    7304693  2018-07-11  10:49:36_291  1.000000e-10  0.002661
2    7304693  2018-07-11  10:49:36_455  1.000000e-10  0.002368
3    7304693  2018-07-11  10:49:36_483           NaN  0.002368