2013-07-15 4 views
1

У меня есть данные, которые будут состоять из нескольких атрибутов, которые могут быть описаны массивами произвольной длины (например, объект может содержать некоторое количество кластеров, и я хочу сохранить размеры каждой составляющей кластер как столбец, но количество кластеров на один объект может варьироваться от 0 до \ infty, в принципе). Есть ли способ поддерживать массивы любой длины в виде данных столбцов в кадре данных Pandas? Я понимаю, что могу использовать панель, но AFAIK нужно было бы знать глубину панели (что в принципе я не могу знать, пока не загружу данные), и, кроме того, панель может быть очень разреженной, поскольку в примере , у многих объектов может быть только очень мало кластеров.Многомерные массивы в столбцах Pandas

Если я просто использую массив numpy с dtype = object, будут ли какие-либо последствия для хранения в H5Store или в исполнении Pandas или что-нибудь еще?

+1

Не могли бы вы добавить столбец с именем «cluster_id» и сохранить его все в простой фреймворке? – user1827356

+0

А, вы имеете в виду, что столбец может содержать dataframes? Имеет ли это последствия для производительности? Я где-то читал, что использование numpy.array в качестве данных столбца не позволит определенных оптимизаций Pandas, но если это не так для dataframes как данные столбца, то отлично! –

+0

Если у вас есть фрейм данных для каждого кластера с колонками ['A', 'B', 'C'], объедините их в новую фреймворк данных с столбцами ['ID', 'A', 'B', 'C'], где ID - уникальный идентификатор для каждого кластера. Таким образом, у вас будет «один» огромный фреймворк (без столбцов, содержащих данные), где каждый кластер будет иметь более одной строки. Я могу опубликовать более подробное объяснение в качестве ответа при необходимости – user1827356

ответ

0

Вместо изменения количества столбцов на объект, который вы бы переменное число строк для каждого объекта

pd.DataFrame({'ClusterID' : '1a,1b,2a,2b,2c,2d,3a'.split(','), 'ObjectID' : [1,1,2,2,2,2,3]}) 
    ObjectID ClusterID 
0  1   1a 
1  1   1b 
2  2   2a 
3  2   2b 
4  2   2c 
5  2   2d 
6  3   3a 

Если каждый кластер имеет несколько атрибутов, вы можете хранить их в отдельную таблицу, как показано ниже. Это позволило бы нескольким объектам обмениваться кластерами без необходимости репликации данных.

pd.DataFrame({'ClusterID' : '1a,1b,2a,2b,2c,2d,3a'.split(','), 'ClusterAttr-1' : 'Attr-1', 'ClusterAttr-2' : 'Attr-2'}) 
    ClusterID ClusterAttr-1 ClusterAttr-2 
0  1a  Attr-1  Attr-2 
1  1b  Attr-1  Attr-2 
2  2a  Attr-1  Attr-2 
3  2b  Attr-1  Attr-2 
4  2c  Attr-1  Attr-2 
5  2d  Attr-1  Attr-2 
6  3a  Attr-1  Attr-2 
Смежные вопросы