如何使用多列NumPy数组的Pandas

时间:2014-10-06 18:11:31

标签: python arrays pandas numpy dataframe

好的,我很难过。我查看了Pandas文档,但我无法找到正确的方法,我认为我只是弄得一团糟。基本上,我的数据是NumPy数组。

例如:

data = numpy.loadtxt('foo.txt', dtype=str,delimiter=',') 
gps_data = numpy.concatenate((data[0:len(data),0:2],data[0:len(data),3:5]),axis=1)
gps_time = data[0:len(data),2:3].astype(numpy.float)/1000

gps_data基本上是这样的:

array([['50.3482627', '-71.662499', '30', 'network'],
       ['50.3482588', '-71.6624934', '30', 'network'],
       ['50.34829', '-71.6625077', '30', 'network'],
       ...,
       ['20.3482488', '-78.66245463999999', '9', 'gps'],
       ['20.3482598', '-78.6625174', '30', 'network'],
       ['20.34824943', '-78.6624565', '10', 'gps']],
      dtype='|S18')

gps_time

array([[  1.16242035e+09],
       [  1.26242036e+09],
       [  1.36242038e+09],
       ...,
       [  1.32330411e+09],
       [  1.16330413e+09],
       [  1.26330413e+09]])

我要做的是使用DataFrame带来另一个名为acc_data的类似外观数组,将其与gps_data合并,然后返回并填写不同的缺失数据倍。

这就是我一直在尝试的:

df1 = DataFrame(gps_data,index=gps_time,columns=['GPS'])

但它会出现以下错误:

ValueError: Shape of passed values is (4, 35047), indices imply (1, 35047)

我不知道如何处理。如果我能找到解决方法,那么我假设下一步df2,但acc_data可以正常工作,然后我可以做:

p = Panel({'ACC': df1, 'GPS': df2})

任何帮助都会非常感激,因为我最近几个小时都对此感到难过。

2 个答案:

答案 0 :(得分:3)

您需要确保传入尽可能多的列名(使用columns关键字),因为NumPy数组中有列:

df1 = DataFrame(gps_data, index=gps_time, columns=['col1', 'col2', 'col3', 'col4'])

Pandas会引发错误,因为您已经为它提供了一个包含四列的数组,而且它只有一个列名'GPS',您已经指定了它。

答案 1 :(得分:2)

ajcr is right;通过指定正确的列数可以避免错误。由于gps_data具有形状(35047,4),因此DataFrame有四列。因此,如果要指定列名,则需要columns=['col1', 'col2', 'col3', 'col4']

要使gps_data处于正确的形状,使用起来也会更容易

import numpy as np
import pandas as pd
data = np.genfromtxt('foo.txt', dtype=None, delimiter=',',
                     usecols=[0,1,2,3,4])
gps_data = data[:, [0,1,3,4]]
gps_time = data[:, 2]/1000.0

然后您可以使用

构建DataFrame
df1 = pd.DataFrame(gps_data, index=gps_time)

<强>注意事项

gps_time = data[0:len(data),2:3]

使gps_time具有二维形状(35047,1)。如果你使用

gps_time = data[0:len(data),2]

然后gps_time将是1维的,具有形状(35047,)。这很可能是你想要的,因为索引(时间)似乎是1维的。


data = numpy.loadtxt('foo.txt', dtype=str,delimiter=',')

制作所有数字字符串。如果你使用

np.genfromtxt('foo.txt', dtype=None, )

dtype=None告诉genfromtxt对每列的类型进行智能猜测 - 因此类似浮点数的数字将自动具有dtype float。