【问题标题】:Drop columns with no header on csv import with pandas在使用熊猫导入 csv 时删除没有标题的列
【发布时间】:2019-08-12 20:48:23
【问题描述】:

这是一个示例 csv:

|  Header A |      | Unnamed: 1 |  Header D |
|-----------|------|------------|-----------|
| a1        | b1   | c1         | d1        |
| a2        | b2   | c2         | d2        |

如果我用pandas.read_csv 导入它,它会变成这样:

  Header A Unnamed: 1 Unnamed: 1.1 Header D
0      a1         b1           c1       d1
1      a2         b2           c2       d2

我的目标是删除所有带有空标题的列,在这种情况下是第二列,但我不能使用 pandas 分配的列名来过滤它们,因为可能还有以Unnamed 开头的非空列,如示例中的第三列。

列是事先不知道的,所以我无法控制它们。

我用read_csv 尝试了以下参数,但没有任何运气:

  • prefix:就是不行!
  • usecols:空头在传递给 usecols 时已经有了名字,这让我无法使用。

我查看了一些关于 SO 的其他答案,如下面的,但没有一个涵盖我的情况:

How to get rid of `Unnamed:` column in a pandas dataframe

Remove Unnamed columns in pandas dataframe

【问题讨论】:

  • 您想保留 CSV 文件中名称为 Unnamed: 1 的列?你是事先写好这个 CSV 文件吗?
  • 这可能是 csv 中以 Unnamedm 开头的列,但我事先不知道。我想涵盖所有可能的情况。
  • 为什么你这样命名你的 csv 列...Unnamed: 1
  • @Wen-Ben 我没有。这是一个示例,表明可以有这样的列名!

标签: python pandas csv


【解决方案1】:

我能想到的唯一方法是事先“偷看”标题并获取非空标题的索引。那么这不是丢弃它们的情况,而是不将它们包含在原始df中。

import csv

import pandas as pd

with open('test.csv') as infile:
    reader = csv.reader(infile)
    headers = next(reader)

header_indices = [i for i, item in enumerate(headers) if item]

df = pd.read_csv('test.csv', usecols=header_indices)

【讨论】:

  • 谢谢。那是简短而有效的。
  • @Bazingaa 谢谢队友,花了一段时间才到那里 :)
【解决方案2】:
  1. 使用 df.columns 阅读要列出的列
  2. 根据您的逻辑创建一个包含 True/False 的 tf_list(搜索 None、Unnamed 等)
  3. filter_df = df.loc[:, tf_list]

【讨论】:

  • 这行不通。损害已经造成,因为 Pandas 会用“未命名:x”填充空白列,并且它与文件中也共享该名称样式的列无法区分
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 2019-12-17
  • 2021-04-30
  • 2015-01-03
  • 2017-08-20
  • 2020-02-10
  • 2020-04-08
相关资源
最近更新 更多