2017-05-26 60 views
1

我有一个numpy 2D阵列,其是其中每行中的元件通过分号分开,但仍存储在单个列中,而不是多个列的形状(4898,)的(在期望的结果)。如何在2D阵列的每个阵列中每次出现分号时创建分割。我已经写了下面的Python脚本来这样做,但它会引发错误。阅读CSV用分号文件作为定界符

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' 

回答

1

如果你使用分号(;)为您的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)) 
+0

谢谢。我必须承认我很愚蠢。 –

+0

它发生了。很高兴我能帮上忙。 –

1

在这种

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

无论x您获得的不是字符串。只有字符串有split()。如果不是字符串,然后它会给这个错误

对象有没有属性“分裂

检查x值。

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) 
+0

是的,这就是我意识到的。非常感谢输入。 –