我有这个代码:
import pandas as pd
data = pd.read_csv("test.csv", sep=",")
数据数组看起来像这样:
问题是我无法按列拆分它,如下所示:
week = data[:,1]
它应该将第二列分成一周,但它没有这样做:
*类型错误:不可散列的类型:“切片” *
我应该如何做才能使其正常工作?
我还想知道,这段代码到底是做什么的? (不太了解np.newaxis部分)
week = data['1'][:, np.newaxis]
结果:
最佳答案
这里有一些问题。
首先,read_csv
默认使用逗号作为分隔符,因此您无需指定。
其次,pandas csv
阅读器默认使用第一行来获取列标题。这似乎不是您想要的,因此您需要使用 header=None
参数。
第三,看起来你的第一列是行号。您可以使用 index_col=0
将该列用作索引。
第四,对于pandas来说,第一个索引是列,而不是行。此外,使用标准 data[ind]
表示法是按列名称而不是列号进行索引。并且您不能使用逗号同时对行和列进行索引(您需要使用 data.loc[row, col]
来执行此操作)。
因此,对于您的情况,获取第二列所需要做的就是data[2]
,或者如果您使用第一列作为行号,那么第二列将成为第一列,所以你会执行data[1]
。这将返回一个 pandas Series
,它是 2D
DataFrame
的 1D
等效项。
所以整个事情应该是这样的:
import pandas as pd
data = pd.read_csv('test.csv', header=None, index_col=0)
week = data[1]
数据
看起来像这样:
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”行不存在,它只是用于提供信息。
周
看起来像这样:
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
但是,您可以在 pandas 中为列(和行)指定有意义的名称,然后通过这些名称访问它们。我不知道列名,所以我只是编了一些:
import pandas as pd
data = pd.read_csv('test.csv', header=None, index_col=0, names=['week', 'spam', 'eggs', 'grail'])
week = data['week']
在这种情况下,数据
如下所示:
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]
与 [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,而是将其转换为 1D numpy 数组,然后添加一个维度使其成为 2D > numpy 数组。
然而,从长远来看,这是危险的。无法保证这种静默转换不会在某个时刻发生改变。要将 pandas 对象更改为 numpy 对象,您应该使用 values
方法进行显式转换,因此在您的情况下 data.values
或 data['1 '].values
.
但是,您实际上并不需要 numpy 数组。 系列
就可以了。如果您确实想要一个2D
对象,您可以使用data['1']之类的东西将
.Series
转换为DataFrame
.to_frame()
关于python - Python 3.4 中的 Numpy 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29345513/