如何使用熊猫从数据框中删除列?

Posted

技术标签:

【中文标题】如何使用熊猫从数据框中删除列?【英文标题】:How to delete a column from a data frame with pandas? 【发布时间】:2015-03-18 02:53:07 【问题描述】:

我读取了我的数据

import pandas as pd
df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t')
print df

然后得到:

          id    text
0    361.273    text1...
1    374.350    text2...
2    374.350    text3...

如何从上述数据框中删除id 列?我尝试了以下方法:

import pandas as pd
df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t')
print df.drop('id', 1)

但它引发了这个异常:

ValueError: labels ['id'] not contained in axis

【问题讨论】:

df.columns 报告的列名是什么?也许列名中有空格? Index([u'id opinion'], dtype='object') 谢谢回复 需要注意的一点,你真的需要删除列吗?您可以通过执行df['text'] 或更一般地df[some_list] 从df 中仅选择感兴趣的列,此外,如果您一开始就不需要它,请不要加载它df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t', usecols=[0]) 我也想删除。但这是一个展示的问题,因为当你实际制作报告时。最好在之前旋转框架还是只删除 de 列? 只是为了完整性df.drop(['id'],1)作品 【参考方案1】:

df.drop(colname, axis=1)(或del df[colname])是删除列的正确方法。

如果出现ValueError,则表示列名与您想象的不完全一致。

检查 df.columns 以查看 Pandas 认为的列名称。

【讨论】:

【参考方案2】:

实际删除列

如果传递的列完全匹配,del df['id']df.drop('id', 1) 应该可以工作

但是,如果您不需要删除该列,那么您可以像这样选择感兴趣的列:

In [54]:

df['text']
Out[54]:
0    text1
1    text2
2    textn
Name: text, dtype: object

如果您一开始就不想使用它,那么您将 cols 列表作为参数传递给 read_csv usecols

In [53]:
import io
temp="""id    text
363.327    text1
366.356    text2
37782    textn"""
df = pd.read_csv(io.StringIO(temp), delimiter='\s+', usecols=['text'])
df
Out[53]:
    text
0  text1
1  text2
2  textn

关于您的错误,这是因为 'id' 不在您的列中,或者拼写不同或有空格。要检查这一点,请查看 print(df.columns.tolist()) 的输出,这将输出列列表,并显示您是否有任何前导/尾随空格。

【讨论】:

问题是如何删除一列。这是一个有效的问题,此答案未解决。我不是反对者。 @TimD 问题的上下文是 OP 想要删除他们不感兴趣的列,我的回答表明,首先,如果您只想使用特定列或实际上,您可能只是不阅读该专栏或只阅读感兴趣的专栏,并且 OP 接受了答案 您确实已经解决了 OP 遇到的问题,这从上下文中可以看出。我从谷歌搜索中找到了这个问题,寻找删除列的方法。在 我的 上下文中,这个答案对我没有帮助,因为我不知道 先验 在我阅读它们之前我需要哪些列。您可能已经解决了 OP 问题,但我敢打赌,该页面的后续访问者会寻找 DataFrame.drop() 并支持提出该问题的答案。 @TimD 我现在添加了附加信息以及如何调试此问题【参考方案3】:

在 pandas 中删除列的最佳方法是使用drop:

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

其中1 编号(0 表示行,1 表示列。)

要删除列而不必重新分配df,您可以这样做:

df.drop('column_name', axis=1, inplace=True)

最后,要按列 number 而不是按列 label 删除,试试这个。 删除,例如第 1、2、4 列:

df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index 

例外:

如果请求的列号或标签错误,则会引发错误。 要检查列数,请使用df.shape[1]len(df.columns.values),要检查列标签,请使用df.columns.values

将引发异常 答案基于@LondonRob 的answer 并留在这里以帮助该页面的未来访问者。

【讨论】:

以上是关于如何使用熊猫从数据框中删除列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含前两列组合的熊猫数据框中删除行

从熊猫数据框中删除大量列

如何基于一个列对象删除熊猫数据框中的多行? [复制]

如何从熊猫数据框中的时间戳列中删除时区

如何根据条件表达式从熊猫数据框中删除行[重复]

如何根据条件表达式从熊猫数据框中删除行[重复]