pandas read_csv不会将最终(未命名)列捕获到数据帧中

时间:2013-12-13 17:01:56

标签: python csv pandas dataframe

我正在尝试使用以下格式读取csv文件

myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING

使用

创建数据框时
dlogframe = pd.read_csv(myPath, header=3)

我收到以下错误(我的数据比上面的例子更复杂,但在功能上相同)

pandas._parser.CParserError: Error tokenizing data. C error: Expected 393 fields in line 9, saw 394

如何为EXTRA_INFO列指定名称并将这些字符串包含在我的数据框中?

[编辑]

我想出了如何跳过麻烦的行,但现在数据没有正确对齐

from StringIO import StringIO
s = """myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING"""

df = pd.read_csv(StringIO(s), header=3, skiprows=[4])
>>print df

            A       B       C                   D
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

我想要的是:

A       B       C       D       MY_INFO
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

3 个答案:

答案 0 :(得分:0)

如果只缺少标题后面的行EXTRA_INFO_STRING,则可以单独加载列名和数据:

from StringIO import StringIO
df = pd.read_csv(StringIO(s), header=None, skiprows=5)

以下代码(可能不是非常优雅的代码)将加载列名称:

df.columns = pd.read_csv(StringIO(s), header=None, 
                       nrows=1, skiprows=3).T.append(['MY_INFO'])[0]
# 0      A       B       C       D             MY_INFO
# 0  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
# 1  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING
# 2  dataA   dataB   dataC   dataD   EXTRA_INFO_STRING

测试中使用的数据:

s = """myHeader
myJunk
myDate
A, B, C, D
, b, c, d
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING
dataA, dataB, dataC, dataD, EXTRA_INFO_STRING"""

答案 1 :(得分:0)

怎么样:

df = pd.read_csv(StringIO(s), skiprows=5, header = None, index_col = False)
df.columns = list("ABCDE")

有时,如果您对read_csv数字转换有问题,可以添加dtype = object 进入read_csv调用并稍后使用DataFrame.astype处理转换。

答案 2 :(得分:0)

这是我尝试过的东西,它似乎以您想要的格式获取数据。基本的想法是忽略所有有问题的行' (如果您了解文件结构,则可能)。

x = pd.read_csv(StringIO.StringIO(s), names=['a', 'b', 'c', 'd', 'more_info'], header=None, skiprows=5)

这会以您希望的格式提供输出。

我的经验是read_csv,在得到自己想要的东西之前,必须尝试一些组合。

希望这有帮助。