транспониране на подмножество колони в рамка с данни (не groupby, трябва да създадете нови колони)

Имам таблица, която има две колони, първата е индексът на сайта, а втората е броят състояния на час за 24 часа. Така за всеки сайт имам 24(реда)x2(колони) данни. Как мога да транспонирам втората колона (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

може ли някой да предложи друго по-лесно решение? Благодаря ви предварително.

Оригинални данни: (благодарение на Andy Hayden за данните)

   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
Тъй като sitesData съдържа две колони, първата е индексът на сайта, а втората е siteState. sitesData съдържа n информация за сайта, следователно има n*24 реда данни. За всеки сайт има 24 реда в siteData. Не мога просто да транспонирам 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