我在将.tab文件读入Python 3.7时遇到问题,希望有人能提供帮助。 问题是标题中的列名和实际数据使用不同的分隔符:
Example of part of column row:
| ID | DESIGNATION | GLON | GLAT |
Example of part of data:
1 HIGALBM0.0002+0.2799 0.000153 0.279931
如您所见,标题包括空格和竖线,而数据只有空格(数量可变,范围在 4 到 10 个空格之间(。我在熊猫中尝试了以下方法:
pd.read_csv('filename.tab',sep='s+',skiprows=[0,2,3],engine='python')
我跳过了第一、第三和第四行,因为它们是标题的不相关部分(创建日期、变量类型和单位(。 这不起作用,因为它返回的列数是应有的两倍(~150 左右 ~75(:
返回的列名示例:
'|', 'ID', '|.1', 'DESIGNATION', '|.2', 'GLON', '|.3', 'GLAT', '|.4'
因此,它似乎将条形图注册为单独的列。这会弄乱数据,因为返回的前 75 个具有实际列的值,但有些列以柱线命名。 然后,最后返回的 75 个只是 nan,但其中一些具有实际上是数据一部分的名称。
我相当广泛地搜索了这个网站和互联网的其余部分,但找不到任何关于如何做到这一点的信息。有人有什么建议吗?非常感谢。
您可以通过两次调用read_csv来读取标头和数据。首先,我们读取数据跳过标题行,然后只读取标题并将这些列标签分配给我们在第一步中读取的数据帧:
s="""| ID | DESIGNATION | GLON | GLAT |
1 HIGALBM0.0002+0.2799 0.000153 0.279931 """
df = pd.read_csv(io.StringIO(s), sep='s+', skiprows=1, header=None, engine='python')
df.columns = pd.read_csv(io.StringIO(s), sep='s*|s*', usecols=[1,2,3,4], nrows=0, engine='python').columns
df
# ID DESIGNATION GLON GLAT
#0 1 HIGALBM0.0002+0.2799 0.000153 0.279931