【问题标题】:read_csv shifting columns and skipping wrong rowsread_csv 移动列并跳过错误的行
【发布时间】:2019-09-21 20:01:41
【问题描述】:

我正在使用 Pandas 到 read_csv 将 CSV 文件导入 Jupyter 笔记本。

您可以找到CSV file at this link。它在标题行之前有两个空行。 当我使用时:

df = pd.read_csv('data/2008-03-21_downloaded.csv', skiprows= 2)

生成的 df 具有所有列标题。

如果我添加index_col=False:

df = pd.read_csv('data/2008-03-21_downloaded.csv', skiprows=[1,2], index_col=False)

结果使用一行数据作为标题,而不是实际的标题名称。

我似乎无法跳过前两行并使用实际标题作为标题 [Account, Account Name, Amount, etc...]

【问题讨论】:

  • 这是标题行:ACCOUNT,ACCOUNT NAME,AMOUNT,AUTH CODE,AVS,BRAND,CARD ENDING,CVD,FIRST NAME,LAST NAME,MERCHANT TRANS. ID,OPTION CODE,DATE,TXN ID,CONF. NO.,ERROR CODE,AUTH TYPE,TYPE,TXT_CITY%2CTXT_COUNTRY%2CTXT_EMAIL%2CTXT_PHONE%2CTXT_STATE%2CTXT_ADDR1%2CTXT_ADDR2%2CZIP%2CCONSUMER_IP,,,,,,,

标签: pandas csv


【解决方案1】:

您的第一个代码版本没问题。两个初始行是空的,应该 被跳过。

但请注意,输入文件中的列名之一(参见 DATA 视图 - 有一段时间你的帖子包含它)包含 %2C, 这是 逗号 的十六进制代码。

显然您的标题行已损坏,这就是为什么在您的 DATA 查看有一堆列标题为Unnamed

一种选择是在此详细信息中使用标题行进行排序(替换 每个 "%2C" 用逗号),然后重复阅读。

另一种选择是:

  • 传递 skiprows=3 参数(也跳过标题行),
  • 传递 names 参数,并为 所有 列提供正确的列名。

您的第二个版本的代码是错误的,因为行编号从 。 不要被 Excel 中的行号误导,行号从 one 开始。

【讨论】:

    【解决方案2】:

    修复您的csv 文件:

    • 如前所述,标题有点乱。以下代码将%2CTXT_%2C 替换为,
    • 仅当您有多个文件需要修复时才需要这样做
    • 您可以根据需要添加其他修复。
    • pathlib 是标准库的一部分
    from pathlib import Path
    
    p = Path('some_path')
    files = p.rglob('*.csv')  # files in top dir and all subdirs
    
    
    for file in files:
        file_updated = file.parents[0] / f'{file.stem}_updated{file.suffix}'
        with file.open('r') as f:
            with file_updated.open('w') as f2:
                for cnt, line in enumerate(f):
                    if 'ACCOUNT NAME' in line.split(','):
                        print(cnt, line)
                        line = line.replace('%2CTXT_', ',')
                        line = line.replace('%2C', ',')
                        print(cnt, line)
    
                    f2.write(line)
    
    • 当我下载并测试您的文件时,脚本没有读取标题前的其他行,我认为这与标题中的帐户前 有关。
    • 我们将创建一个新文件,而不是覆盖旧文件,并将_updated 附加到stem

    _updated 文件读入单个数据帧:

    p = Path('some_path')
    files = p.rglob('*_updated.csv')
    
    df = pd.concat([pd.read_csv(file) for file in files])
    

    【讨论】:

    • 如果您必须循环浏览包含数千个 csv 文件的文件夹并出现相同错误,该怎么办。每个 CVS 保存一天的数据,并且有数百个这样的文件。有什么方法可以循环浏览整个文件夹并更新?
    • @SMJune 是的。等我一下。所有名称都与显示的相似吗?你是一个窗户吗?
    • 是的,所有文件都具有相同的结构...当我尝试合并它们时,我能够使用此代码:all_files = glob.glob(path + "/*.csv")全部,但上面解决的格式错误是把它扔掉
    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 2018-07-27
    • 2019-01-02
    • 1970-01-01
    • 2021-12-02
    • 2015-02-04
    相关资源
    最近更新 更多