2014-01-22 5 views
0

я имею прибл 11 миллионов строк с 21 столбцов, как так:Создание строк из значений в нескольких колонках

area_id_number, c000, c001, c002 ... 
01293091302390, 2, 2, 0 ... 
01293091302391, 2, 0, 0 ... 
01293091302392, 3, 1, 1 ... 

Я хотел бы закончить с чем-то вроде этого: убежище

value_id, area_id_number, value_type 
     1, 01293091302390, c000 
     2, 01293091302390, c000 
     3, 01293091302390, c001 
     4, 01293091302390, c001 
     5, 01293091302391, c000 
     6, 01293091302391, c000 
     7, 01293091302392, c000 
     8, 01293091302392, c000 
     9, 01293091302392, c000 
     10, 01293091302392, c001 
     11, 01293091302392, c002 
... 

I Не удалось найти способ сделать это еще. Я посмотрел на unpack/pivot/deaggregate (не смог найти правильное решение с любым из этих условий ...)

Вторая часть этого вопроса: у меня будут проблемы с памятью? Есть ли какие-то соображения эффективности, которые я должен учитывать? В итоге я получаю около 140 миллионов строк.

+0

Зачем вам это нужно? Похож на проблему [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

+0

Надеюсь, мое редактирование улучшит вопрос. Кстати, это проблема xy! Я собираюсь генерировать случайные точки w/в этих геометриях. ;) – tapzx2

ответ

1

Основной процесс рассчитывается ndarray.repeat(), у меня не хватает памяти для теста 11M строк, но вот код:

создать тестовые данные первым:

import numpy as np 
import pandas as pd 

#create sample data 
nrows = 500000 
ncols = 21 

nones = int(70e6) 
ntwos = int(20e6) 
nthrees = int(10e6) 

rint = np.random.randint 

counts = np.zeros((nrows, ncols), dtype=np.int8) 
counts[rint(0, nrows, nones), rint(0, ncols, nones)] = 1 
counts[rint(0, nrows, ntwos), rint(0, ncols, ntwos)] = 2 
counts[rint(0, nrows, nthrees), rint(0, ncols, nthrees)] = 3 

columns = ["c%03d" % i for i in range(ncols)] 
index = ["%014d" % i for i in range(nrows)] 

df = pd.DataFrame(counts, index=index, columns=columns) 

Вот код процесса :

idx, col = np.where(df.values) 
n = df.values[idx, col] 
idx2 = df.index.values[idx.repeat(n)] 
col2 = df.columns.values[col.repeat(n)] 
df2 = pd.DataFrame({"id":idx2, "type":col2}) 
+0

ГИРИ, это работает красиво. Это далеко за пределами моего уровня программирования, я сделаю все возможное, чтобы учиться на нем. Спасибо. – tapzx2

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