2016-07-31 2 views
4

Я хотел бы взять в качестве ПАНДЫ Dataframe с именем df, который имеет столбец идентификаторов и столбцы списков с переменным количеством кортежей, все кортежи имеют одинаковую длину. Похоже, это:Pandas - Распаковать столбец списков разной длины кортежей

ID list 
1 [(0,1,2,3),(1,2,3,4),(2,3,4,NaN)] 
2 [(Nan,1,2,3),(9,2,3,4)] 
3 [(Nan,1,2,3),(9,2,3,4),(A,b,9,c),($,*,k,0)] 

И я хотел бы, чтобы распаковать каждый список в столбцы «A», «B», «C», «D», представляющей фиксированные позиции в каждом наборе.

Результат должен выглядеть следующим образом:

ID A B C D 
1 0 1 2 3 
1 1 2 3 4 
1 2 3 4 NaN 
2 NaN 1 2 3 
2 9 2 3 4 
3 NaN 1 2 3 
3 9 2 3 4 
3 A b 9 c 
3 $ * k 0 

Я попытался df.apply(pd.Series(list), но не как len из элементов списка отличается на разных строках. Как-то нужно распаковать столбцы и транспонировать по ID?

ответ

4
In [38]: (df.groupby('ID')['list'] 
      .apply(lambda x: pd.DataFrame(x.iloc[0], columns=['A', 'B', 'C', 'D'])) 
      .reset_index()) 
Out[38]: 
    ID level_1 A B C D 
0 1  0 0 1 2 3 
1 1  1 1 2 3 4 
2 1  2 2 3 4 NaN 
3 2  0 NaN 1 2 3 
4 2  1 9 2 3 4 
5 3  0 NaN 1 2 3 
6 3  1 9 2 3 4 
7 3  2 A b 9 c 
8 3  3 $ * k 0 
+0

Какой колдовство это! Отлично! – clg4

+0

. @ Chrisb Когда я запускаю это, я получаю >> конструктор DataFrame неправильно вызванный! – Merlin

+0

Прекрасно работает для меня. Версия панд? – clg4

0

Векторизованных путь будет

In [2237]: dff = pd.DataFrame(np.concatenate(df['list'].values), columns=list('ABCD')) 

In [2238]: dff['ID'] = df.ID.repeat(df['list'].str.len()).values 

In [2239]: dff 
Out[2239]: 
    A B C D ID 
0 0.0 1.0 2.0 3.0 1 
1 1.0 2.0 3.0 4.0 1 
2 2.0 3.0 4.0 nan 1 
3 nan 1.0 2.0 3.0 2 
4 9.0 2.0 3.0 4.0 2 
5 nan 1 2 3 3 
6 9 2 3 4 3 
7 A b 9 c 3 
8 $ * k 0 3 

Подробности

In [2240]: df 
Out[2240]: 
    ID            list 
0 1  [(0, 1, 2, 3), (1, 2, 3, 4), (2, 3, 4, nan)] 
1 2      [(nan, 1, 2, 3), (9, 2, 3, 4)] 
2 3 [(nan, 1, 2, 3), (9, 2, 3, 4), (A, b, 9, c), (... 
Смежные вопросы