如何在使用 pandas 读取 csv 文件时删除特定列?

Posted

技术标签:

【中文标题】如何在使用 pandas 读取 csv 文件时删除特定列?【英文标题】:How to drop a specific column of csv file while reading it using pandas? 【发布时间】:2018-07-31 15:06:08 【问题描述】:

在使用 pandas 加载 csv 时,我需要删除带有标签 namecolumn。我正在按如下方式读取 csv 并希望在其中添加参数来执行此操作。谢谢。

pd.read_csv("sample.csv")

我在阅读 csv 后知道这样做:

df.drop('name', axis=1)

【问题讨论】:

您是否事先知道您的 CSV 有哪些列? @cᴏʟᴅsᴘᴇᴇᴅ:我不知道列的总数,但它会超过 100。我需要代码来处理任意数量的列。谢谢。 【参考方案1】:

如果你事先知道列名,可以通过设置usecols参数来实现

当您知道要使用哪些列时

假设您有一个包含 ['id','name','last_name'] 列的 csv 文件,而您只需要 ['name','last_name']。你可以这样做:

import pandas as pd
df = pd.read_csv("sample.csv", usecols = ['name','last_name'])

当你想要前 N 列时

如果您不知道列名,但您想要数据框中的前 N ​​列。你可以这样做

import pandas as pd
df = pd.read_csv("sample.csv", usecols = [i for i in range(n)])

编辑

当您知道要删除的列的名称时

# Read column names from file
cols = list(pd.read_csv("sample_data.csv", nrows =1))
print(cols)

# Use list comprehension to remove the unwanted column in **usecol**
df= pd.read_csv("sample_data.csv", usecols =[i for i in cols if i != 'name'])

【讨论】:

我需要除标有“name”的列之外的所有其他列,并且我不知道其他标签、列数或标签“name”的位置b>'。所以我不能使用这个答案,但感谢您的回复。 编辑后的想法很好,对我很有用。谢谢:) 读取 0 行也有效,而且速度更快,虽然非常有限。【参考方案2】:

使用pd.read_csvnrows=1 从您的CSV 中获取列标题,然后使用usecols 进行后续读取以提取除您要省略的列之外的所有内容。

headers = [*pd.read_csv('sample.csv', nrows=1)]
df = pd.read_csv('sample.csv', usecols=[c for c in headers if c != 'name']))

或者,您可以使用 CSV 模块非常有效地执行相同的操作(只读标题),

import csv

with open("sample.csv", 'r') as f:
    header = next(csv.reader(f))
    # For python 2, use
    # header = csv.reader(f).next()

df = pd.read_csv('sample.csv', usecols=list(set(header) - 'name'))

【讨论】:

这很好用。有没有办法在不导入“csv”包的情况下做到这一点?我的意思是,只使用熊猫。 @AnonGeorge 您可以使用pd.read_csv(..., nrows=1),然后检查标题。把它作为练习留给你:) header = csv.reader(f).next() 在 python 3 中不起作用,我已经编辑了您的答案以更正它,但被拒绝了。 :(【参考方案3】:

使用df= df.drop(['ID','prediction'],axis=1) 为我完成了这项工作。我删除了“ID”和“预测”列。确保将它们放在方括号中,例如['column1','column2']。 不需要其他复杂的解决方案。

【讨论】:

这有效,而不是再次复制到 df 虽然你可以添加一个 arg inplace=True 例如df.drop(['ID','prediction'],axis=1, inplace=True)。这将直接在 df 上应用更改。 OP 已经声明他们知道如何使用drop,所以不是问题的答案。【参考方案4】:

可以在阅读时删除列。

columns_to_be_removed = ['a', 'b']

data = pd.read_csv(sourceFileName).drop(columns_to_be_removed, axis = 'columns')

【讨论】:

您的解决方案只是链接操作。在read_csv 调用中仍会读取该列。【参考方案5】:

read_csv() 的唯一参数可用于选择您使用的列是usecols。根据文档,usecols 接受类似列表或可调用的。因为您只知道要删除的列,所以不能使用要保留的列的列表。所以使用可调用对象:

pd.read_csv("sample.csv", 
            usecols=lambda x: x != 'name'
            )

如果您有一个不想使用的列名列表,您当然可以说x not in ['unwanted', 'column', 'names']

【讨论】:

以上是关于如何在使用 pandas 读取 csv 文件时删除特定列?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除错误行错误的行并使用 pandas 或 numpy 读取剩余的 csv 文件?

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

如何在使用 pandas.read_csv 读取 csv 文件时将 pandas.dataframe 中的元素转换为 np.float?

使用pandas读取csv文件时如何选择多行?

如何使用包含引号并使用多个分隔符的 pandas 读取 CSV 文件

pandas读取csv文件时避免科学计数法(xxxe+09)