python - Python 3.4 中的 Numpy 2D 数组

标签 python arrays numpy

我有这个代码:

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

数据数组看起来像这样:

enter image description here

问题是我无法按列拆分它,如下所示:

week     = data[:,1]

它应该将第二列分成一周,但它没有这样做:

*类型错误:不可散列的类型:“切片” *

我应该如何做才能使其正常工作?

我还想知道,这段代码到底是做什么的? (不太了解np.newaxis部分)

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

结果:enter image description here

最佳答案

这里有一些问题。

首先,read_csv 默认使用逗号作为分隔符,因此您无需指定。

其次,pandas csv 阅读器默认使用第一行来获取列标题。这似乎不是您想要的,因此您需要使用 header=None 参数。

第三,看起来你的第一列是行号。您可以使用 index_col=0 将该列用作索引。

第四,对于pandas来说,第一个索引是列,而不是行。此外,使用标准 data[ind] 表示法是按列名称而不是列号进行索引。并且您不能使用逗号同时对行和列进行索引(您需要使用 data.loc[row, col] 来执行此操作)。

因此,对于您的情况,获取第二列所需要做的就是data[2],或者如果您使用第一列作为行号,那么第二列将成为第一列,所以你会执行data[1]。这将返回一个 pandas Series,它是 2D DataFrame1D 等效项。

所以整个事情应该是这样的:

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.valuesdata['1 '].values.

但是,您实际上并不需要 numpy 数组。 系列就可以了。如果您确实想要一个2D对象,您可以使用data['1']之类的东西将Series转换为DataFrame .to_frame().

关于python - Python 3.4 中的 Numpy 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29345513/

相关文章:

Python - 使用 iGraph 绘制节点层次结构

python - 在计算共振峰频率特征时如何确定线性预测系数(LPC)中的滤波器阶数?

c++ - 在 C++ 构造函数中为结构数组分配存储空间

c - sprintf 到 c 中的 char 指针列表?段错误

python - fsolve 和 numpy 的使用

python - 使用不对称的自定义误差线按组制作seaborn.barplot

python - scrapy可以完成表单提交并做浏览器能做的一切吗

java - 在线性时间内找到未排序数组的中位数?

python - 当 x = y 时,Numpy 和 R 在线性回归中给出非零截距

python - Pandas datetime 查找给定日期之前最近的日期。如果不存在,则获取最近的日期