Преобразовать столбец панд из числовых массивов в числовой массив более высокого размера - PullRequest
0 голосов
/ 16 июня 2019

У меня есть pandas dataframe формы (75,9).

Только один из этих столбцов состоит из массивов numpe, каждый из которых имеет форму (100, 4, 3)

У меня странное явление:

data = self.df[self.column_name].values[0]

имеет форму (100,4,3), но

data = self.df[self.column_name].values

имеет форму (75,), причем min и max не являются «числовым объектом»

Я ожидал, что data = self.df[self.column_name].values будет иметь форму (75, 100, 4, 3), с некоторыми min и max.

Как сделать столбецмассивов с номерами ведут себя как массив массивов с более высоким размером (с длиной = количество строк в кадре данных)?


Воспроизведение:

    some_df = pd.DataFrame(columns=['A'])
    for i in range(10):
        some_df.loc[i] = [np.random.rand(4, 6)]
    print some_df['A'].values.shape
    print some_df['A'].values[0].shape

печать (10L,), (4L,6L) вместо желаемого (10L, 4L, 6L), (4L,6L)

Ответы [ 2 ]

1 голос
/ 16 июня 2019
In [42]: some_df = pd.DataFrame(columns=['A']) 
    ...: for i in range(4): 
    ...:         some_df.loc[i] = [np.random.randint(0,10,(1,3))] 
    ...:                                                                                  
In [43]: some_df                                                                          
Out[43]: 
             A
0  [[7, 0, 9]]
1  [[3, 6, 8]]
2  [[9, 7, 6]]
3  [[1, 6, 3]]

Числовые значения столбца являются массивом объектов типа dtype, содержащим массивы:

In [44]: some_df['A'].to_numpy()                                                          
Out[44]: 
array([array([[7, 0, 9]]), array([[3, 6, 8]]), array([[9, 7, 6]]),
       array([[1, 6, 3]])], dtype=object)

Если все эти массивы имеют одинаковую форму, stack прекрасно объединяет их вновое измерение:

In [45]: np.stack(some_df['A'].to_numpy())                                                
Out[45]: 
array([[[7, 0, 9]],

       [[3, 6, 8]],

       [[9, 7, 6]],

       [[1, 6, 3]]])
In [46]: _.shape                                                                          
Out[46]: (4, 1, 3)

Это работает только с одним столбцом.stack как и все concatenate обрабатывает входной аргумент как итеративный, по сути, список массивов.

In [48]: some_df['A'].to_list()                                                           
Out[48]: 
[array([[7, 0, 9]]),
 array([[3, 6, 8]]),
 array([[9, 7, 6]]),
 array([[1, 6, 3]])]
In [50]: np.stack(some_df['A'].to_list()).shape                                           
Out[50]: (4, 1, 3)
1 голос
/ 16 июня 2019

То, что вы просите, не совсем возможно.Панды DataFrames являются 2D.Да, вы можете хранить массивы NumPy как object s (ссылки) внутри ячеек DataFrame, но это не очень хорошо поддерживается, и ожидать получения shape, который имеет одно измерение из DataFrame и два из массивов внутри, невозможно вообще.

Вам следует рассмотреть возможность хранения ваших данных либо целиком в массивах NumPy соответствующей формы, либо в одном собственно 2D DataFrame с MultiIndex.Например, вы можете «повернуть» столбец одномерных массивов, чтобы стать столбцом скаляров, если переместите дополнительное измерение на новый уровень MultIndex в строках:

  A
x [2, 3]
y [5, 6]

становится:

    A
x 0 2
  1 3
y 0 5
  1 6

или поворот по столбцам:

  A
  0 1
x 2 3
y 5 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...