2013-09-11 9 views
1

Мой первый вопрос StackOverflow.Эффективная математизация кадра данных pandas

Так что у меня DataFrame панды, который выглядит вроде этого:

String1 String2 String3 value 
word1 word2 word3 5.6 
word4 word5 word6 123.4 
... 

Этот вид DataFrame поставляется с очень длинной цепью обработки на основе огромного количества текста. (Как примечание, я приближаюсь к ограничениям памяти и сейчас рассматриваю HDFStores.)

Теперь я хотел бы сделать операции линейной алгебры, основанные на преобразовании этой таблицы в (разреженную) панель или какую-то другую вид эффективной структуры данных, которая заполняет пробелы с 0s. То есть, я хотел бы создать таблицу, строки которой String3s и чьи столбцы представляют собой строки String1 x String2, а затем выполняют операции линейной алгебры по строкам. Тем не менее, я также хотел бы иметь возможность сделать то же самое с любым другим столбцом - т. Е. Взять String1 в виде строк и сделать столбцы из String2 x String3.

Я экспериментировал с панелями и сводными таблицами, но они, похоже, не совсем правильные, и они часто переполняют память.

Каков правильный способ сделать это с помощью Pandas или Python (2.7) в целом?

Edited добавить этот пример:

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

String1String2 (word1,word2) (word1,word5) (word4,word2) (word4,word5) ... 
String3 
word3 5.6 0 0 0 ... 
word6 0 0 0 123.4 ... 

Количество столбцов в основном будет | String1 | x | String2 |. Альтернативно, String3 в качестве столбцов и String1String2 в виде строк также будет прекрасным, так как я могу выполнять операции над серией столбцов.

ред далее, чтобы добавить этот вопрос памяти:

In [1]: import pandas as pd 

In [2]: A = pd.load("file.df") 

In [3]: A 
Out[3]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 18506532 entries, 0 to 18506531 
Columns: 4 entries, 0 to value 
dtypes: float64(1), object(3) 

In [4]: B = A[A[1] == 'xyz'] 

In [5]: C = B.pivot_table('value', [1,2], 0) 

Это разбивает с MemoryError на линии 160 в reshape.pyc. Это версия 0.11.0 из панд.

+0

Вы можете привести пример желаемого результата, например. для примера вы даете –

+0

Я отредактировал в ответ на ваш вопрос, теперь он имеет пример таблицы вывода. Я не знаю, находится ли он в хорошем формате вывода панд, но может быть, это трюк? –

ответ

1

Вы можете сделать это с помощью pivot_table:

In [11]: res = df.pivot_table('value', 'String3', ['String1', 'String2']) 

In [12]: res 
Out[12]: 
String1 word1 word4 
String2 word2 word5 
String3    
word3  5.6 NaN 
word6  NaN 123.4 

Этот результат, вероятно, будет достаточно, но если вы хотите, чтобы пустые столбцы, вы можете использовать itertools.product.

In [13]: from itertools import product 

In [14]: res = res.reindex(columns=list(product(df['String1'], df['String2']))) 

In [15]: res.columns.names = ['String1', 'String2'] 

In [16]: res 
Out[16]: 
String1 word1   word4  
String2 word2 word5 word2 word5 
String3        
word3  5.6 NaN NaN NaN 
word6  NaN NaN NaN 123.4 

и заполнить пробелы с 0:

In [17]: res.fillna(0) 
Out[17]: 
String1 word1   word4  
String2 word2 word5 word2 word5 
String3        
word3  5.6  0  0 0.0 
word6  0.0  0  0 123.4 

Примечание: в 0,13 cartesian_product будет доступен в pandas.tools.util.

+0

Итак, я пробовал это с моим столом, и он быстро взрывается с MemoryError на фактическом стержне. Я занимаюсь только подмножеством таблицы (загруженной в память), которая составляет всего 1,5 М тройки со значениями (полная таблица - 18 М тройки). Я на самом деле реплицирую алгоритм, который кто-то использовал в другой среде, чтобы сделать это, поэтому мне интересно, есть ли эффективная встроенная ярлык или мне просто нужно найти способ сделать это итеративно. –

+0

на каком бите он взрывается? –

+0

Я отредактировал этот вопрос, чтобы предоставить контекст кода ipython того, что я делаю. Помогло бы это увидеть полную обратную линию? Он явно не исчерпал полную память моего компьютера. Он использует примерно 4 ГБ, а затем не работает. О, и подмножество «xyz» моего DataFrame A, как я уже сказал, 1,5 М троек. –

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