以分号作为分隔符

时间:2017-05-26 06:52:27

标签: python arrays numpy

我有一个numpy 2D数组,其形状为(4898, ),其中每行中的元素由分号分隔,但仍存储在单个列中而不是多列(期望的结果)。如何在2D阵列的每个阵列中每次出现分号时创建分割。我编写了以下Python脚本来执行此操作,但它会引发错误。

stochastic_gradient_descent_winequality.py

import numpy
import pandas

if __name__ == '__main__' :

    with open('winequality-white.csv', 'r') as f_0 :
        with open('winequality-white-updated.csv', 'w') as f_1 :
            f_0.next()
            for line in f_0 :
                f_1.write(line)


    wine_data = pandas.read_csv('winequality-white-updated.csv', sep = ',', header = None)
    wine_data_ = wine_data
    wine_data = numpy.array([x.split(';') for x in wine_data_], dtype = numpy.float)

    print (numpy.shape(wine_data))

错误

Traceback (most recent call last):
  File "stochastic_gradient_descent_winequality.py", line 16, in <module>
    wine_data = numpy.array([x.split(';') for x in wine_data_], dtype = numpy.float)
AttributeError: 'numpy.int64' object has no attribute 'split'

4 个答案:

答案 0 :(得分:4)

如果您使用分号(;)作为csv文件分隔符而不是逗号(,),则可以调整第一行:

wine_data = pandas.read_csv('winequality-white-updated.csv', sep = ';', header = None)

列表理解的问题是[x.split(';') for x in wine_data_]遍历列名称

在这种情况下,您不需要具有列表理解的行。您可以读取数据并完成。

wine_data = pandas.read_csv('winequality-white-updated.csv', sep = ',', header = None)
print (numpy.shape(wine_data))

答案 1 :(得分:1)

在此

x.split(';') for x in wine_data_  

你得到的x不是字符串。只有字符串split()。如果它不是字符串,那么它将给出此错误

  

对象没有属性&#39; split

检查x值。

答案 2 :(得分:1)

假设你的csv文件是这样的:

2.12;5.12;3.12
3.1233;4;2
4;4.9696;3
2;5.0344;3
3.59595;4;2
4;4;3.59595
...

然后改变你的代码:

import pandas, numpy
wine_data = pandas.read_csv('test.csv', sep = ',', header = None)
wine_data_ = wine_data
wine_data = numpy.array([x.split(';') for x in wine_data_[0]], dtype = numpy.float)
wine_data

wine_data将是:

array([[ 2.12   ,  5.12   ,  3.12   ],
       [ 3.1233 ,  4.     ,  2.     ],
       [ 4.     ,  4.9696 ,  3.     ],
       [ 2.     ,  5.0344 ,  3.     ],
       [ 3.59595,  4.     ,  2.     ],
       [ 4.     ,  4.     ,  3.59595]])

更有效率:

import pandas, numpy
wine_data = pandas.read_csv('test.csv', sep = ';', header = None)
wine_data = numpy.array(wine_data,dtype = numpy.float)

答案 3 :(得分:0)

您可以尝试这样的事情...

def get_y(r): 
    return str(r['label']).split(' ')

result :
   (PILImage mode=RGB size=800x800, TensorMultiCategory([0., 0., 0., 1., 0., 0.]))