pandas датафрейм массивов в матрицу - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь преобразовать массив данных pandas, содержащий массивы, в матрицу и ищу лучший способ сделать это. Допустим, у меня есть этот фрейм данных, и я хотел бы вырезать две строки, которые должны привести к матрице размером 2x2.

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]})
df['a'] = df['a'].map(np.array)

Следующие атрибуты генерируют массив объектов numpy, что приводит к массиву размер 2:

df.loc[0:1,'a'].to_numpy().shape   # (2,)
df.loc[0:1,'a'].values.shape       # (2,)
np.array(df.loc[0:1,'a'].values).shape   # (2,)
np.array(df.loc[0:1,'a']).shape    # (2,)

Это самое близкое решение, которое я нашел, но оно добавляет дополнительное измерение, и я не понимаю, почему это работает, но не те, что указаны выше.

np.array([df.loc[0:1,'a']]).shape  #( 1,2,2)

Существует ли решение для непосредственного преобразования его в фигуру [2, 2] без зацикливания или удаления дополнительных измерений?

Ответы [ 3 ]

2 голосов
/ 24 января 2020

Преобразовать значение во вложенные списки, а затем в array:

a = np.array(df.loc[0:1,'a'].tolist())
print (a)
[[1 2]
 [3 4]]

print (a.shape)
(2, 2)

df2 = pd.DataFrame({'a':[[1,2], [3,4], [5,6]],'b':[[1,2], [3,4], [5,6]] })
print (df2)
        a       b
0  [1, 2]  [1, 2]
1  [3, 4]  [3, 4]
2  [5, 6]  [5, 6]

b = np.array(df2.loc[0:1,'a':'b'].values.tolist())
print (b)
[[[1 2]
  [1 2]]

 [[3 4]
  [3 4]]]

print (b.shape)
(2, 2, 2)
1 голос
/ 24 января 2020

Создается массив (2,2), который вы хотите. Я также добавил df2 с двумя столбцами, которые могут быть преобразованы в массив 2x2x2 для ваших комментариев. Но мое решение похоже на взлом. Я уверен, что это может быть улучшено.

import pandas as pd
import numpy as np

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]]})
df['a'] = df['a'].map(np.array)
np.concatenate(df.loc[0:1,'a'],axis = 0).reshape(2,-1).shape

df2 = pd.DataFrame({'a':[[1,2], [3,4], [5,6]],'b':[[1,2], [3,4], [5,6]] })
np.array(df2.loc[0:1,'a':'b'].applymap(np.array)
         .apply(np.concatenate, axis = 0)).reshape(2,2,-1).shape
0 голосов
/ 24 января 2020

Я внес небольшую модификацию в ответ, отправленный @jezrael. Надеюсь, это сработает для вас.

Предположим, ваш фрейм данных такой:

df = pd.DataFrame({'a':[[1,2], [3,4], [5,6]],'b':[[11,2], [6,9], [5,6]]})

сделать это для обоих столбцов

a = np.array(df.loc[0:1,'a'].tolist()) b = np.array(df.loc[0:1,'b'].tolist())

, а затем объединить два массива

np.concatenate((a, b), axis=1).reshape(-1,2,2).shape

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...