У меня есть ndarray с формой (2,1). Каждый элемент представляет собой массив с формой (4) Я хочу создать фрейм данных с формой (2,4)

Правильные формы:

df.shape = (2,1)
df[0].shape = (1,)
df[0][0].shape = (4,)

Например:

df[0][0] = [1 2 2 4]
df[1][0] = [1 1 1 1]

Я хочу, чтобы это выглядело так:

df[0] = [1 2 2 4]
df[1] = [1 1 1 1]
-1
Koren Levenbrown 2 Июл 2019 в 17:32

3 ответа

Лучший ответ

Похоже, у вас есть массив dtype объекта (но почему он называется df?):

In [150]: df = np.empty((2,1),object)                                                                           
In [151]: df[0,0] = np.array([1,2,2,4])                                                                         
In [152]: df[1,0] = np.array([1,1,1,1])                                                                         
In [153]: df                                                                                                    
Out[153]: 
array([[array([1, 2, 2, 4])],
       [array([1, 1, 1, 1])]], dtype=object)
In [154]: df.shape                                                                                              
Out[154]: (2, 1)
In [155]: df[0].shape                                                                                           
Out[155]: (1,)
In [156]: df[0,0].shape                                                                                         
Out[156]: (4,)

np.concatenate (или одно из stack производных) может присоединиться к списку / итерируемому массиву, если они совпадают по размеру.

stack, примененный непосредственно к df, не работает, потому что он имеет (2,1) форму:

In [157]: np.stack(df)                                                                                          
Out[157]: 
array([[array([1, 2, 2, 4])],
       [array([1, 1, 1, 1])]], dtype=object)

Но если мы сначала растянем (или сожмем) массив, то получим (2,) форму:

In [158]: np.stack(df.ravel())                                                                                  
Out[158]: 
array([[1, 2, 2, 4],
       [1, 1, 1, 1]])
0
hpaulj 2 Июл 2019 в 15:46

Вы можете использовать другой массив данных для перестановки, а затем установить его обратно, например:

df2 = pd.DataFrame([df[0][0], df[0][1]])
df = df2

ОБНОВЛЕНИЕ : относительно комментария от @Koren Levenbrown

df = np.array([df[column][0] for column in df])

Другое решение

0
Albo 3 Июл 2019 в 08:01

Вы хотите что-то вроде этого:

df = pd.DataFrame(a.reshape((2, 4)).T)

df
   0  1
0  1  1
1  2  1
2  2  1
3  4  1

Или же:

df = pd.DataFrame(a.reshape((2, 4)))

df
   0  1  2  3
0  1  2  2  4
1  1  1  1  1
0
zipa 2 Июл 2019 в 14:38