我有这个代码:
import pandas as pd
data = pd.read_csv("test.csv", sep=",")
数据数组如下所示:
问题是我无法按列将其拆分,如下所示:
week = data[:,1]
它应将第二列拆分为一周,但不这样做:
* TypeError:无法散列的类型:'slice'*
我应该如何做才能使其正常工作?
我也想知道,这段代码到底能做什么?(不太了解np.newaxis部分)
week = data['1'][:, np.newaxis]
结果:
这里有一些问题。
首先,read_csv
默认情况下使用逗号作为分隔符,因此无需指定。
其次,csv
默认情况下,熊猫阅读器使用第一行获取列标题。这似乎不是您想要的,因此您需要使用header=None
参数。
第三,看起来您的第一列是行号。您可以使用index_col=0
该列作为索引。
第四,对于大熊猫,第一个索引是列,而不是行。此外,使用标准data[ind]
符号是按列名而不是列号建立索引。而且,您不能使用逗号同时索引行和列(您需要使用它data.loc[row, col]
来做到)。
因此,对于您的情况,获取第二列所需要做的就是data[2]
,或者如果将第一列用作行号,则第二列将成为第一列,因此您可以这样做data[1]
。这将返回一个大熊猫Series
,1D
相当于一个2D
DataFrame
。
所以整个事情应该像这样:
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
,而是将其转换为1D
numpy数组,然后添加一个维度以使其成为2D
numpy数组。
但是,这是长期危险的。无法保证这种静默转换不会在某个时候更改。要将pandas对象更改为numpy对象,应使用显式转换values
方法,因此在您的情况下data.values
或data['1'].values
。
但是,您实际上并不需要一个numpy数组。Aseries
很好。如果你真的想要一个2D
对象,你可以转换Series
成DataFrame
使用类似data['1'].to_frame()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句