pandas read_csv忽略最后一列中的分隔符

时间:2017-05-22 19:48:38

标签: python pandas dataframe

我有一个具有以下结构的文件(第一行是标题,文件名是test.dat):

ID_OBS          LAT     LON     ALT TP TO LT_min LT_max STATIONNAME
ALT_NOA_000   82.45  -62.52   210.0 FM  0    0.0   24.0 Alert, Nunavut, Canada

如何指示pandas将整个电台名称(在本例中为 Alert,Nunavut,Canada )作为元素读取?我在代码中使用delim_whitespace=True,但这不起作用,因为工作站名称包含空格字符。

运行:

import pandas as pd
test = pd.read_csv('./test.dat', delim_whitespace=True, header=1)
print(test.to_string())

产地:

                   ID_OBS    LAT LON  ALT   TP    TO  LT_min    LT_max STATIONNAME
ALT_NOA_000 82.45  -62.52  210.0  FM    0  0.0  24.0  Alert,  Nunavut,      Canada

快速阅读教程并没有帮助。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我经常通过编写自己的小解析器来解决这些问题。一般来说,有一些方法可以根据您的意愿弯曲熊猫,但我发现这种方式通常更容易:

<强>代码:

import re

def parse_my_file(filename):
    with open(filename) as f:
        for line in f:
            yield re.split(r'\s+', line.strip(), 8)

# build the generator        
my_parser = parse_my_file('test.dat')

# first element returned is the columns
columns = next(my_parser)

# build the data frame
df = pd.DataFrame(my_parser, columns=columns)
print(df)

<强>结果:

        ID_OBS    LAT     LON    ALT  TP TO LT_min LT_max  \
0  ALT_NOA_000  82.45  -62.52  210.0  FM  0    0.0   24.0   

              STATIONNAME  
0  Alert, Nunavut, Canada 

答案 1 :(得分:1)

您粘贴的示例文件有点含糊不清:例如,如果看起来像几个空格的内容是标签,则无法通过眼睛判断。

一般来说,请注意,普通的旧Python比Pandas或CSV模块更具表现力(Pandas&s;强度在其他地方)。例如,甚至有用于递归下降解析器的Python模块,Pandas显然缺乏这些模块。您可以使用常规Python将文件操作为更容易的形式,以便Pandas进行解析。例如:

import re
>>> ['@'.join(re.split(r'[ \t]+', l.strip(), maxsplit=8)) for l in open('stuff.tsv') if l.strip()]
['ID_OBS@LAT@LON@ALT@TP@TO@LT_min@LT_max@STATIONNAME',
 'ALT_NOA_000@82.45@-62.52@210.0@FM@0@0.0@24.0@Alert, Nunavut, Canada']

将分隔符更改为'@',例如,如果您回写文件,则可以使用delimiter='@'进行解析。