关于python:如何从包含pandas的数据框中删除列?

How to delete a column from a data frame with pandas?

我读了我的数据

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

得到:

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

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

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

但这引发了一个例外:

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


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

如果一个ValueError被提升,这意味着列名与您所认为的不完全相同。

查看df.columns查看pandas认为哪些列的名称。


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

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

其中,1是轴号(行为0),列为1)。

要在不重新分配df的情况下删除列,可以执行以下操作:

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

最后,要按列号而不是按列标签删除,请尝试此操作。要删除,例如第一列、第二列和第四列:

1
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的答案,并留下来帮助未来的访问者。


实际删除列

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

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

1
2
3
4
5
6
7
8
In [54]:

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

如果你一开始不想这样做,那么你就把cols列表作为参数usecols传递给read_csv

1
2
3
4
5
6
7
8
9
10
11
12
13
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())的输出,这将输出列列表,并显示是否有任何前导/尾随空格。