2015-03-30 3 views
1

У меня есть этот код:Numpy 2D массива в Python 3.4

import pandas as pd 
data = pd.read_csv("test.csv", sep=",") 

массив данных выглядит следующим образом:

enter image description here

Проблема заключается в том, что я не могу разделить его по столбцам, как что:

week  = data[:,1] 

он должен разделить вторую колонку в неделю, но это не делает:

* TypeError: unhashable типа: 'срез' *

Как я должен сделать это, чтобы заставить его работать?

Мне также интересно, что именно этот код делает? (Не понимаю np.newaxis части)

week  = data['1'][:, np.newaxis] 

Результат: enter image description here

+1

re: 'np.newaxis': напечатать атрибут' .shape' 'data ['1']' и 'data ['1'] [:, np.newaxis]' –

+0

Вот. CSV-файл : http://www.filedropper.com/test_82 – Twi

ответ

3

Есть несколько вопросов здесь.

Во-первых, read_csv использует запятую как разделитель по умолчанию, поэтому вам не нужно указывать это.

Во-вторых, читатель pandas csv по умолчанию использует первую строку для получения заголовков столбцов. Это не похоже на то, что вы хотите, поэтому вам нужно использовать аргумент header=None.

В-третьих, похоже, что ваш первый столбец - это номер строки. Вы можете использовать index_col=0, чтобы использовать этот столбец в качестве индекса.

В-четвертых, для панд первым индексом является столбец, а не строка. Кроме того, с использованием стандартного нотации data[ind] индексируется по имени столбца, а не номер столбца. И вы не можете использовать запятую для индексации как строки, так и столбца одновременно (для этого вам нужно использовать data.loc[row, col]).

Итак, для вашего случая все, что вам нужно сделать, чтобы получить второй столбец, - data[2], или если вы используете первый столбец в качестве номера строки, тогда второй столбец станет первым столбцом, поэтому вы сделаете . Это возвращает pandas Series, что соответствует 1D эквиваленту 2DDataFrame.

Так что все это должно выглядеть следующим образом:

import pandas as pd 
data = pd.read_csv('test.csv', header=None, index_col=0) 
week = data[1] 

data выглядит следующим образом:

1 2  3 4 
0      
1 10 2 100 12 
2 15 5 150 15 
3 25 7 240 20 
4 22 12 350 20 
5 51 13 552 20 
6 134 20 880 36 
7 150 22 900 38 
8 200 29 1020 44 
9 212 31 1100 46 
10 199 23 1089 45 
11 220 32 1145 60 

'0' строка не существует, это только там для информационных целей.

week выглядит следующим образом:

0 
1  10 
2  15 
3  25 
4  22 
5  51 
6  134 
7  150 
8  200 
9  212 
10 199 
11 220 
Name: 1, dtype: int64 

Однако, вы можете дать столбцы (и строки) значимые имена в панд, а затем получить доступ к ним с помощью этих имен.Я не знаю, имена столбцов, так что я просто сделал некоторые до:

import pandas as pd 
data = pd.read_csv('test.csv', header=None, index_col=0, names=['week', 'spam', 'eggs', 'grail']) 
week = data['week'] 

В этом случае data выглядит следующим образом:

week spam eggs grail 
1  10  2 100  12 
2  15  5 150  15 
3  25  7 240  20 
4  33 12 350  20 
5  51 13 552  20 
6 134 20 880  36 
7 150 22 900  38 
8 200 29 1020  44 
9 212 31 1100  46 
10 199 23 1089  45 
11 220 32 1145  50 

И week выглядит следующим образом:

1  10 
2  15 
3  25 
4  33 
5  51 
6  134 
7  150 
8  200 
9  212 
10 199 
11 220 
Name: week, dtype: int64 

Для np.newaxis то, что делает, добавляет одно измерение в массив. Так скажите, что у вас есть массив 1D (вектор), используя np.newaxis на нем, превратив его в массив 2D. Он превратил бы массив 2D в массив 3D, 3D в 4D и так далее. В зависимости от того, где вы положили его (например, [:,np.newaxis] vs. [np.newaxis,:], вы можете определить, какой размер для добавления. Так np.arange(10)[np.newaxis,:] (или просто np.arange(10)[np.newaxis]) дает форму (1,10)2D массив, в то время как np.arange(10)[:,np.newaxis] дает форму (10,1)2D массив.

В вашем случае, что линия делает, получается столбец с именем 1, который является 1D pandas Series, а затем добавляет к нему новое измерение. Однако вместо того, чтобы превращать его обратно в DataFrame, он вместо этого преобразует его в a numpy array, затем добавляет одно измерение, чтобы сделать его массив numbox 2D.

Это, впрочем, опасно долговременно. Нет никакой гарантии, что такое молчаливое преобразование в какой-то момент не будет изменено. Чтобы изменить объекты pandas на numpy, вы должны использовать явное преобразование с помощью метода values, поэтому в ваших случаях data.values или data['1'].values.

Однако вам не нужен массив numpy. A series в порядке. Если вы действительно хотите объект 2D, вы можете конвертировать Series в DataFrame, используя что-то вроде data['1'].to_frame().

Смежные вопросы