Как создать (правильно) массив NumPy из Pandas DF - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать массив NumPy для столбца "label" из pandas фрейма данных.

My df:

      label                                             vector
0         0   1:0.044509422 2:-0.03092437 3:0.054365806 4:-...
1         0   1:-0.007471546 2:-0.062329583 3:0.012314787 4...
2         0   1:-0.009525825 2:0.0028720177 3:0.0029517233 ...
3         1   1:-0.0040618754 2:-0.03754585 3:0.008025528 4...
4         0   1:0.039150625 2:-0.08689039 3:0.09603256 4:0....
...     ...                                                ...
59996     1   1:0.01846487 2:-0.012882819 3:0.035375785 4:-...
59997     1   1:0.01435293 2:-0.00683616 3:0.009475072 4:-0...
59998     1   1:0.018322088 2:-0.017116712 3:0.013021051 4:...
59999     0   1:0.014471473 2:-0.023652712 3:0.031210974 4:...
60000     1   1:0.00888336 2:-0.006902163 3:0.022569133 4:0...

Как вы можете видите, у меня есть два столбца: метка и вектор. Для метки col я использую это решение:

y = pd.DataFrame([df.label])

print(y.astype(float).to_numpy())

print(y)

В результате получаю следующее:


   0     1     2     3     4     5     6     7     8     9     10    11    12    13    14    15     ... 59985 59986 59987 59988 59989 59990 59991 59992 59993 59994 59995 59996 59997 59998 59999 60000
label     0     0     0     1     0     0     0     0     0     0     0     1     0     1     0     1  ...     1     1     1     0     1     0     0     1     1     1     1     1     1     1     0     1

[1 rows x 60001 columns]

Однако ожидаемый результат должен быть:

     0         
0    0
1    0
2    0
3    1

... ...

[60001 rows x 1 columns]  

Вместо массива с [1 rows x 60001 columns] Я хотел бы иметь массив с [60001 rows x 1 columns]

Спасибо за ваше время

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вместо массива с [1 строк x 60001 столбцов] я хотел бы иметь массив с [60001 строк х 1 столбцов] : Если я правильно понимаю вашу проблему и вам нужно изменить форму вашего массива, используя:

y = y.reshape(-1, 1)

Это преобразует ваш массив в форму, которая имеет один столбец и автоматически установит количество строк для вас (измерение, назначенное с -1, автоматически вычисляется от размера массивов и других размеров формы). Таким образом, вы можете сделать одно из следующих действий:

Предложенный способ + изменение формы:

y = pd.DataFrame([df.label]).astype(float).to_numpy().reshape(-1, 1)

Или предлагаемый ответ @ cs95 (который приводит к тому же массиву):

y = df[['label']].astype(float).to_numpy()
0 голосов
/ 20 апреля 2020

Если вы начнете с фрейма данных

In [98]: df                                                                                            
Out[98]: 
   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

и выберете столбец по имени, вы получите серию:

In [99]: df.a                            # df['a']                                                              
Out[99]: 
0    0
1    4
2    8
Name: a, dtype: int64
In [100]: type(_)                                                                                      
Out[100]: pandas.core.series.Series

* to_numpy серии - это массив 1d :

In [101]: df.a.to_numpy()                                                                              
Out[101]: array([0, 4, 8])
In [102]: _.shape                                                                                      
Out[102]: (3,)

Но вы взяли серию и превратили ее обратно в информационный кадр:

In [103]: y = pd.DataFrame([df.a])                                                                     
In [104]: y                                                                                            
Out[104]: 
   0  1  2
a  0  4  8

Было ли это вашим намерением? В любом случае извлеченный массив имеет вид 2d:

In [105]: y.to_numpy()                                                                                 
Out[105]: array([[0, 4, 8]])
In [106]: _.shape                                                                                      
Out[106]: (1, 3)

Мы можем изменить его или сделать «транспонирование»:

In [107]: __.T                # reshape(3,1)                                                                         
Out[107]: 
array([[0],
       [4],
       [8]])

Если мы опускаем [] из y выражение, мы получаем другой фрейм данных и желаемый массив 'column':

In [109]: pd.DataFrame(df.a)                                                                           
Out[109]: 
   a
0  0
1  4
2  8
In [110]: pd.DataFrame(df.a).to_numpy()                                                                
Out[110]: 
array([[0],
       [4],
       [8]])

другой вариант - выбрать столбец со списком:

In [111]: df[['a']]                                                                                    
Out[111]: 
   a
0  0
1  4
2  8

A Series - это pandas версия массива 1d numpy. У него есть индексы строк, но нет столбцов. DataFrame - это 2d, со строками и столбцами.

Имейте в виду, что массив numpy может иметь формы (3,), (1,3) и (3,1), все с те же 3 элемента.

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