如何让pandas停止跳过TSV文件中的第一个空白列?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让pandas停止跳过TSV文件中的第一个空白列?相关的知识,希望对你有一定的参考价值。

使用pandas.read_csv()导入制表符分隔的数据文件(TSV)时,我会返回一个具有正确列名称的数据帧(因此列出正确的数量),但它似乎已将数据从每列向左移动1这也导致最后的最右列是所有NaN值。

我怀疑这是因为第一列在TSV文件中是完全空白的(我相信该文件的创建者使用None作为python中此列的值,然后使用df.to_csv()创建该文件)。如何导入数据,以便我的数据框最终以第一列为全部NaN,这是我想要的,只要列中有空白值?

我的用例涉及很多这些TSV文件,其中一些将有空白的charge_code列,但其中一些列中将包含有意义的数据。因此,我需要一个动态解决方案,可以检查列的空白性质,然后自动将其全部设置为NaN

数据文件的示例:

    6   MISOPROSTOL, ORAL, 200 MCG  kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard
    13  DIALYSIS/STRESS VITAMIN SUPL ORAL 100 CAPSULES  kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard
    30  PRENATAL VITAMINS 30-DAY SUPPLY kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard
    50  COMP CONT LENS EVAL kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard

我试图用来导入的代码:

pd.read_csv('problem_lines.tsv', delimiter = r'\t',
            header = None,
            names = ['charge_code', 'price', 'description', 'hospital_id',
                    'filename', 'charge_type'], 
            index_col = False)

而代码的输出:

charge_code price   description hospital_id filename    charge_type
0   6.0 MISOPROSTOL, ORAL, 200 MCG  kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard    NaN
1   13.0    DIALYSIS/STRESS VITAMIN SUPL ORAL 100 CAPSULES  kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard    NaN
2   30.0    PRENATAL VITAMINS 30-DAY SUPPLY kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard    NaN
3   50.0    COMP CONT LENS EVAL kaiser-foundation-southern-region   106191300_CDM_2018.xlsx standard    NaN
答案

如果你想让charge_code列为NaNs,那么在你读完之后设置它:

import numpy as np

df = pd.read_csv('problem_lines.tsv', delimiter = r'\t',
        header = None,
        names = ['price', 'description', 'hospital_id',
                'filename', 'charge_type'], 
        index_col = False)

df['charge_code'] = np.nan
另一答案

奇怪的是,我想我已经弄明白了。我将分隔符的原始字符串更改为常规字符串,现在,由于某种原因,它可以正常工作。我必须承认,我有点困扰,我不完全理解它为什么会起作用,所以如果你有任何建议,我很乐意听到它们!

新功能代码:

pd.read_csv('problem_lines.tsv', delimiter = '\t',
            header = None,
            names = ['charge_code', 'price', 'description', 'hospital_id',
                    'filename', 'charge_type'], 
            index_col = False)

以上是关于如何让pandas停止跳过TSV文件中的第一个空白列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 tsv 文件中提取第一列?

在 csv 导入 pandas 期间跳过行

添加行时如何使python停止跳过csv文件中的行[重复]

Python Pandas read_csv 跳过行但保留标题

读取csv,tsv,txt中的数据

大 TSV 文件中主要为整数的字符串列的不一致 pandas read_csv dtype 推断