使用Numpy将DataFrame拆分为数组

时间:2018-07-09 02:30:53

标签: python numpy jupyter-notebook

我有一个名为data的文件,如下所示:

Some Text Information (lines 1-6 in file)
1 22 23
2 44 44
3 55 55
4 66 66
5 77 77

我想要实现的是这样的:

 [[ 22.  23.]
 [ 44.    44.]
 [ 55.  55.]
 [  66.   66.]
 [ 77.  77.]]

我遇到的问题是我使用的代码无法正确地从文件中拆分数据。最终看起来像这样:

 [   1 22 23
0    2 44 44
1  3 55 55, Empty DataFrame
Columns: [1 6734 1453]
Index: [],      1 22 23
2      4 44 44
3    5   55 55
4    6 66 66
5    7 77 77
   EOF]

这是我正在使用的代码:

def loadFile(filename):
    df1 = pd.read_fwf(filename, skiprows=6)
    df1 = np.split(df, [2,2])
    print('The data points:\n {}'.format(df1[:5]))

我了解split函数的参数。例如,[2,2]应该从我的数据帧创建两个子数组,并且我的轴为0。但是,为什么它不能正确地拆分该数组?

3 个答案:

答案 0 :(得分:0)

不要使用read_fwf,让大熊猫弄清楚表的结构:

df = pd.read_csv("yourfile", skiprows=6, header=None, sep='\s+')

答案 1 :(得分:0)

您可以将文件读入pandas dataFrame并从中访问values属性。假定“某些文本信息”不是header

import pandas as pd

df = pd.read_table(filepath, sep='\t', index_col= 0, skiprows = 6, header = None)

df.values                      # gives you the numpy ndarray

这应将第一列用作index。另外,您可能需要删除sep参数,以便让 read_table 弄清楚。另外,请尝试使用其他分隔符。如果您在数据中获得行索引,请尝试切片以获得所需的结果。使用类似的东西:

df.iloc[:,1:].values

答案 2 :(得分:0)

详细说明ManKind_008的答案:

您的显式行号是问题所在。熊猫会将其解释为有效数据。 使用ManKinds解决方案确实可以正确设置索引列,但是由于行号从零开始,因此最终得到一个DataFrame,如:

pd.read_fwf('test.csv', header=None, index_col=0, skiprows=6)
    1   2
0        
1  22  23
2  44  44
3  55  55
4  66  66
5  77  77

相反,我建议您使用以下方法读取所有数据:

pd.read_fwf('test.csv', header=None, skiprows=6).iloc[:, 1:]
    1   2
0  22  23
1  44  44
2  55  55
3  66  66
4  77  77

这使您拥有了所需的东西。 iloc调用将忽略数据的第一行(您的行号)。

从这里df.values命令将为您提供:

array([[22, 23],
   [44, 44],
   [55, 55],
   [66, 66],
   [77, 77]])

如果您不需要np.array,则可以使用list()函数将其显式转换为列表。