【问题标题】:read_csv shifting column headersread_csv 移动列标题
【发布时间】:2019-07-19 11:44:19
【问题描述】:

我正在尝试使用read_csv 将逗号分隔的文本文件读入 Python。但是,Python 正在获取标题并将其向右移动一个。

列数少于我实际拥有的列数的数据文件示例:(包含更多数据的示例文件:https://www.dropbox.com/s/5glujwqux6d0msh/test.txt?dl=0

DAY,TIME,GENVEG,LATI,LONGI,AREA,CHEM
 226,  1200,     2,   -0.5548999786D+01,    0.3167600060D+02,    0.1000000000D+07, NaN
 226,  1115,     2,   -0.1823500061D+02,    0.3668500137D+02,    0.1000000000D+07, NaN

如果我尝试以下操作(infile_fire 是上面的 txt 文件):

df_fires = pd.read_csv(infile_fire,sep="\,",skipinitialspace=True,engine='python')

我在下面得到这个。如您所见,DAY 实际上高于TIME 列。 (请注意,AREA 列中的值来自我在较大数据集中的数据,这些数据未在上面的示例子集中显示)

我也尝试了df_fires = pd.read_csv(infile_fire).reset_index(),虽然它确实创建了一个新索引(正如我所希望的那样),但它也将226 列移到上面并将其命名为index 而不是DAY这应该。

我也尝试了以下方法,但仍然得到相同的结果(移动标题)

df = pd.read_csv(infile_fire)

df = pd.read_csv(infile_fire,index_col=None)

df = pd.read_csv(infile_fire,index_col=0)

我该如何解决这个问题?我只想读取文本文件并让 Python 设置一个新索引并保持标题不变。

【问题讨论】:

  • 您的数据文件有 6 列,但您的图片有 7 列。
  • 那是因为样本的数据比我的实际数据集少,实际数据集有 40 多列。我只是在上面放了一个示例供参考。
  • 无法按原样复制。如果我使用read_csv(),索引列包含行号,就像您针对您提供的 csv 数据所做的那样。
  • 我的意思是使示例保持一致,以便清楚您想要什么。
  • @coldspeed 已编辑

标签: python pandas csv indexing


【解决方案1】:

无需摆弄选项,就像 pandas 做正确的事,请参阅 read_csvcsv.Sniffer 文档中的 sep

from io import StringIO

import pandas as pd

data = """
DAY,TIME,GENVEG,LATI,LONGI,AREA
 226,  1200,     2,   -0.5548999786D+01,    0.3167600060D+02,    0.1000000000D+07
 226,  1115,     2,   -0.1823500061D+02,    0.3668500137D+02,    0.1000000000D+07
"""

df = pd.read_csv(StringIO(data))
df

【讨论】:

  • 我需要以.txt 文件的形式读取数据,因为这最终必须用作函数
  • 使用 stringio 只是为了说明目的,关键是 read_csv 将使用 csv.Sniffer 并且它会弄清楚你的 csv 的方言是什么。只是不要提供额外的选项,如 sep 等。你需要用你自己的文件句柄替换 StringIO。
【解决方案2】:

作为 file.txt 将您要阅读的文件作为文件。

file.txt = """
    DAY,TIME,GENVEG,LATI,LONGI,AREA
     226,  1200,     2,   -0.5548999786D+01,    0.3167600060D+02,    0.1000000000D+07
     226,  1115,     2,   -0.1823500061D+02,    0.3668500137D+02,    0.1000000000D+07
    """

使用:

import pandas as pd

读取文件:

df = pd.read_csv('file.txt')

如果你看看你的df.AREA[0],它会是这样的:

'    0.1000000000D+07'

使用regular expressions 删除空格:

df.replace('(^\s+|\s+$)', '', regex=True, inplace=True)

如果您现在尝试拨打您的df,结果将是:

   DAY  TIME  GENVEG               LATI             LONGI              AREA
0  226  1200       2  -0.5548999786D+01  0.3167600060D+02  0.1000000000D+07
1  226  1115       2  -0.1823500061D+02  0.3668500137D+02  0.1000000000D+07

所以,您的df.AREA[0] 将是这样的:

'0.1000000000D+07'

就像其他人一样,例如:df.LATI[0]

'-0.5548999786D+01'

【讨论】:

    【解决方案3】:

    将 index 设置为 False 可以解决此问题。

    df = pd.read_csv(infile_fire,index_col=False)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 2019-08-10
      • 2016-12-12
      • 1970-01-01
      • 2011-11-07
      • 2013-05-14
      相关资源
      最近更新 更多