如何在使用 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 时,我需要删除带有标签 name 的 column。我正在按如下方式读取 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_csv
和nrows=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?