【问题标题】:Pandas: CSV header and data row size mismatchPandas:CSV 标头和数据行大小不匹配
【发布时间】:2018-10-11 16:04:54
【问题描述】:

是否可以指示 Pandas 忽略位置超出标题大小的列?

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123\n")

df = pandas.read_csv('test.csv')
print(df)

给出答案:

              datetime    A
0  2018-10-09 18:00:07  123

然而,加载包含更多数据列的 CSV 文件,在标题中定义:

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

df = pandas.read_csv('test.csv')
print(df)

返回:

                        datetime     A
2018-10-09 18:00:07 123      ABC   XYZ

Pandas 将标题移动到数据的最右边。

我需要不同的行为。我希望 pandas 忽略超出标题的数据行。

注意:我无法枚举列,因为它是一个通用用例。由于某些独立于我的代码的原因,有时会有更多数据,这是预期的。我想忽略多余的数据。

【问题讨论】:

  • 忽略行,还是忽略列?

标签: python pandas csv


【解决方案1】:

Pandas 似乎意识到与实际标题相比列太多了,它假设前两个(数据)列是(多)索引。

read_csv中的usecols参数指定要读取的数据列:

import pandas

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

df = pandas.read_csv('test.csv', usecols=[0,1]) 
print(df)

产量

              datetime    A
0  2018-10-09 18:00:07  123

【讨论】:

  • 它需要更多代码,但您的建议可以解决问题。谢谢!
  • @RyszardStyczynski 鉴于您的示例代码,这应该足够了。我猜你的意思是说你的实际代码和数据需要更多的工作。但是,如果此代码不适用于您问题中的代码,请告诉我:也许我忽略了某些内容或有什么问题。
  • 你是对的。我刚刚实现了完全相反的情况:当标题比数据长时。没有必要,因为 pandas 支持它。再次感谢。
【解决方案2】:

现在代码显示问题的答案。

with open('test.csv', mode='w') as csv_file:
    csv_file.write("datetime,A\n")
    csv_file.write("2018-10-09 18:00:07, 123, ABC, XYZ\n")

with open("test.csv") as csv_file:
    for i, line in enumerate(csv_file):
        if i == 0:
            headerCount = line.count(",") + 1
            colCount = headerCount
        elif i == 1:
            dataCount = line.count(",") + 1  
        elif i > 1:
            break
if (headerCount < dataCount):
    print("Warning: Header and data size mismatch. Columns beyond header size will be removed.")
    colCount=headerCount

df = pandas.read_csv('test.csv', usecols=range(colCount))
print(df)

产生:

Warning: Header and data size mismatch. Columns beyond header size will be removed.
              datetime    A
0  2018-10-09 18:00:07  123

【讨论】:

    【解决方案3】:

    为了使问题完整,以下代码可以解决问题:

    with open('test.csv', mode='w') as csv_file:
        csv_file.write("datetime,A, B, C\n")
        csv_file.write("2018-10-09 18:00:07, 123\n")
    
    with open("test.csv") as csv_file:
        for i, line in enumerate(csv_file):
            if i == 0:
                headerCount = line.count(",") + 2
            elif i == 1:
                dataCount = line.count(",") + 2  
                if (headerCount != dataCount):
                    print("Warning: Header and data size mismatch. Columns beyond header size will be removed.")
            elif i > 1:
                break
    
    
    df = pandas.read_csv('test.csv', usecols=range(dataCount-1))
    print(df)
    

    给出正确的 pandas 对象。

    Warning: Header and data size mismatch. Columns beyond header size will be removed.
                  datetime    A
    0  2018-10-09 18:00:07  123
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 2021-01-31
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多