将单元与Pandas DataFrame相关联

时间:2013-05-06 23:47:34

标签: python csv pandas

我使用的Web服务返回一个CSV响应,其中第一行包含列名,第二行包含列单位,例如:

longitude,latitude
degrees_east,degrees_north
-142.842,-1.82
-25.389,39.87
-37.704,27.114

我可以把它读成Pandas DataFrame:

import pandas as pd
from StringIO import StringIO

x = '''
longitude,latitude
degrees_east,degrees_north
-142.842,-1.82
-25.389,39.87
-37.704,27.114
'''

# Create a Pandas DataFrame
obs=pd.read_csv(StringIO(x.strip()), sep=",\s*")

print(obs)

产生

      longitude       latitude
0  degrees_east  degrees_north
1      -142.842          -1.82
2       -25.389          39.87
3       -37.704         27.114

但是,将单位与DataFrame列相关联以供以后使用的最佳方法是什么,例如标记图?

1 个答案:

答案 0 :(得分:2)

允许pandas读取第二行,因为数据搞砸了列的dtype。字符串的存在不是float dtype,而是列object的dtype,而底层对象,甚至是数字,都是字符串。这搞砸了所有的数字操作:

In [8]: obs['latitude']+obs['longitude']
Out[8]: 
0    degrees_northdegrees_east
1                -1.82-142.842
2                 39.87-25.389
3                27.114-37.704

In [9]: obs['latitude'][1]
Out[9]: '-1.82'

因此pd.read_csv必须跳过第二行。

以下是相当难看的,但考虑到输入的格式,我没有看到更好的方法。

import pandas as pd
from StringIO import StringIO

x = '''
longitude,latitude
degrees_east,degrees_north
-142.842,-1.82
-25.389,39.87
-37.704,27.114
'''

content = StringIO(x.strip())

def read_csv(content):
    columns = next(content).strip().split(',')
    units = next(content).strip().split(',')
    obs = pd.read_table(content, sep=",\s*", header=None)
    obs.columns = ['{c} ({u})'.format(c=col, u=unit)
                   for col, unit in zip(columns, units)]
    return obs

obs = read_csv(content)
print(obs)
#    longitude (degrees_east)  latitude (degrees_north)
# 0                  -142.842                    -1.820
# 1                   -25.389                    39.870
# 2                   -37.704                    27.114
print(obs.dtypes)
# longitude (degrees_east)    float64
# latitude (degrees_north)    float64