如何使用pandas从数据框中删除一列?

43
我读取我的数据。
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

3
df.columns 报告的是数据框中的列名是什么?也许有些列名中包含空格吗? - unutbu
索引([u'id opinion'], dtype='object') - newWithPython
1
需要注意的一点是,你真的需要删除这一列吗?你可以通过df['text']或更一般地说df[some_list]从数据框中选择感兴趣的列。此外,如果你一开始就不想要它,那么就不要加载它df = pd.read_csv('/path/file.tsv', header=0, delimiter='\t', usecols=[0]) - EdChum
我也想删除它。但这是一个展示问题,当你实际制作报告时。最好在删除列之前旋转框架还是直接删除列? - xavier
2
仅为完整起见,df.drop(['id'],1) 可以正常工作。 - Gaurav Taneja
3个回答

54

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

如果出现 ValueError 错误,这意味着列名并不是你认为的那样。

可以通过查看 df.columns 来查看 Pandas 认为的列名。


38
使用Pandas删除列的最佳方法是使用drop函数:drop
df = df.drop('column_name', axis=1)

1代表轴号(0表示行,1表示列)。

如果要删除列而不必重新分配df,可以执行以下操作:

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

最后,要按列编号而不是按列标签删除,请尝试以下方法。 要删除第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的答案提供的答案,并在此处留下以帮助未来访问此页面的用户。


20

要实际删除列

del df['id'] 或者 df.drop('id', 1) 应该能够在传入列名完全匹配的情况下起作用。

然而,如果您不需要删除该列,则可以直接选择感兴趣的列,如下所示:

In [54]:

df['text']
Out[54]:
0    text1
1    text2
2    textn
Name: text, dtype: object
如果你一开始就不需要它,那么你可以将列的列表作为参数usecols传递给read_csv函数:

如果你一开始就不需要它,那么你可以将列的列表作为参数usecols传递给read_csv函数:

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())的输出,它会输出列的列表,并显示是否有前导/尾随空格。


8
如何删除一列?这是一个合法的问题,但在这个回答中没有得到解答。我不是那个点踩的人。 - Tim D
1
@TimD 这个问题的背景是OP想要删除他们不感兴趣的一列,我的答案表明,如果您只想使用特定的列,则这并非必要,或者您实际上可以不读取该列或仅读取感兴趣的列,OP接受了该答案。 - EdChum
3
从上下文来看,您确实解决了提问者的问题。我通过谷歌搜索进入这个问题页面,寻找删除列的方法。但在我的情况下,这个答案并没有帮到我,因为在读完数据之前,我无法预先知道需要保留哪些列。您或许已经解决了该提问者的问题,但我相信后来的访问者会更倾向于寻找 DataFrame.drop() 并点赞相关回答。 - Tim D
2
{btsdaf} - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接