2013-07-02 8 views
2

Я хотел бы взять серию Pandas с одноуровневым индексом и разбить на этот индекс в кадр данных с несколькими столбцами. Например, для ввода:Разделите серию Pandas без multiindex

s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) 

s 
a 10 
a 11 
b 12 
b 13 
c 14 
c 15 
c 16 
dtype: int64 

То, что я хотел бы как результат:

a b c 
0 10 12 14 
1 11 13 15 
2 NaN NaN 16 

Я не могу напрямую использовать разборки стопки команды, потому что она требует мультииндексной и у меня есть только индекс одноуровневого , Я попытался вставить фиктивный индекс, который имел одинаковое значение, но я получил сообщение об ошибке «ReshapeError: индекс содержит повторяющиеся записи, не может быть изменен».

Я знаю, что это немного необычно, потому что 1) панды не любят оборванные массивы, поэтому нужно будет заполнить, 2) индекс нужно произвольно сбросить, 3) я не могу на самом деле " инициализировать "кадр данных, пока я не знаю, как долго будет длинный столбец. Но это все еще кажется чем-то, что я должен как-то сделать. Я также думал о том, чтобы делать это с помощью groupby, но похоже, что нет ничего подобного grouped_df.values ​​() без какой-либо агрегационной функции - возможно, по вышеуказанным причинам.

ответ

2

Вы можете использовать groupby, apply, reset_index создать серию мультииндексных, а затем вызвать unstack:

import pandas as pd 
s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) 
df = s.groupby(level=0).apply(pd.Series.reset_index, drop=True).unstack(0) 
print df 

выход:

a b c 
0 10 12 14 
1 11 13 15 
2 NaN NaN 16 
0

Не знаете, как это обобщается. Я называю это группой по конкатентному шаблону. По существу применяется, но с контролем над тем, как именно он сочетается.

In [24]: s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c']) 

In [25]: df = DataFrame(dict(key = s.index, value = s.values)) 

In [26]: df 
Out[26]: 
    key value 
0 a  10 
1 a  11 
2 b  12 
3 b  13 
4 c  14 
5 c  15 
6 c  16 

In [27]: concat(dict([ (g,Series(grp['value'].values)) for g, grp in df.groupby('key') ]),axis=1) 
Out[27]: 
    a b c 
0 10 12 14 
1 11 13 15 
2 NaN NaN 16 
+0

Отлично, это именно то, что я искал для. Благодаря! – user2543645

Смежные вопросы