транспонировать подмножество столбцов в фрейме данных (не группировать, нужно создавать новые столбцы)

У меня есть таблица с двумя столбцами, первый - это индекс сайта, а второй - количество состояний в час в течение 24 часов. Таким образом, для каждого сайта у меня есть данные 24 (строки) x 2 (столбцы). Как перенести второй столбец (24 строки данных на сайт) в строку, содержащую 24+1 столбца с индексом сайта.

Я нашел наивное решение, используя цикл для создания новой строки:

for i in range(numberOfsites):
    i1 = i*24
    i2 = i1 + 24
    newLine = DataFrame(sitesData,index=list(range(i1,i2)), columns=["siteState"]).T

может ли кто-нибудь предложить другое более простое решение? Заранее спасибо.

Исходные данные: (спасибо Энди Хейдену за данные)

   site_index state
0           1     a
1           1     b
2           1     a
3           2     a
4           2     a
5           2     b

Желаемые данные:

              0  1  2
  site_index
  1           a  b  a
  2           a  a  b

person perigee    schedule 11.06.2013    source источник
comment
Что такое sitesData (почему вы не можете просто транспонировать это)? Я изо всех сил пытаюсь понять, о чем вы здесь спрашиваете, во-первых, написанный вами код создает только один DataFrame (newLine), предположительно, это не то, что вам нужно. Не могли бы вы привести пример с некоторыми поддельными данными?   -  person Andy Hayden    schedule 11.06.2013
comment
Поскольку siteData содержит два столбца, первый — это индекс сайта, а второй — siteState. siteData содержит n информации о сайте, таким образом, содержит n*24 строки данных. Для каждого сайта в файле siteData есть 24 строки. Я не могу просто перенести файлы sitesData.   -  person perigee    schedule 11.06.2013
comment
Я дал некоторые фиктивные данные в своем ответе, так как я лучше всего догадываюсь о том, что вы спрашиваете :)   -  person Andy Hayden    schedule 11.06.2013
comment
Не могли бы вы отредактировать свой вопрос, чтобы отображались как ваши фактические входные данные, так и ваши ожидаемые выходные данные?   -  person Sylvain Leroux    schedule 11.06.2013


Ответы (1)


Хотя это кажется немного хакерским, вы можете использовать groupby:

In [11]: df
Out[11]:
   site_index state
0           1     a
1           1     b
2           1     a
3           2     a
4           2     a
5           2     b

In [12]: g = df.groupby('site_index')

In [13]: g.apply(lambda x: x.state.reset_index(drop=True).T)
Out[13]:
            0  1  2
site_index
1           a  b  a
2           a  a  b

Это также возможно с помощью unstack...

person Andy Hayden    schedule 11.06.2013