如何在pandas中删除列的最佳方法

37

我提出这个问题是为了自己学习。据我所知,以下是在pandas数据帧中删除列的不同方法。

选项 - 1:

df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
del df['a']

选项 - 2:

df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
df=df.drop('a',1)

选项-3:

df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
df=df[['b','c']]
  1. 这些方法中最好的是哪一种?
  2. 还有其他实现相同效果的方法吗?

1
选项2是最常见的。这是pandas从数据框中删除列的方式。 - Sociopath
4个回答

39

按照文档

DataFrame 是一个具有潜在不同类型列的 2 维标记数据结构

以及 pandas.DataFrame.drop

从行或列中删除指定标签

因此,我认为我们应该坚持使用 df.drop。为什么?我认为其优点有:

  1. It gives us more control of the remove action:

    # This will return a NEW DataFrame object, leave the original `df` untouched.
    df.drop('a', axis=1)  
    # This will modify the `df` inplace. **And return a `None`**.
    df.drop('a', axis=1, inplace=True)  
    
  2. It can handle more complicated cases with it's args. E.g. with level, we can handle MultiIndex deletion. And with errors, we can prevent some bugs.

  3. It's a more unified and object oriented way.


就像@jezrael在他的回答中所指出的:

选项1:使用关键词 del 是有限的方式。

选项3:而且 df=df[['b','c']] 本质上并不是一种删除方法。它首先通过索引选择数据,然后取消与原始DataFrame绑定并将其绑定到新的DataFrame上(即df[['b','c']])。


14

在pandas数据框中删除列或行的推荐方法是使用drop。

要删除一列,

df.drop('column_name', axis=1, inplace=True)
删除一行:

要删除一行,

df.drop('row_index', axis=0, inplace=True)

您可以参考此帖子,了解有关删除列的方法的详细讨论。


4
从速度上来看,选项1似乎是最佳选择。显然,根据其他回答,这并不意味着它实际上是最佳选择。
In [52]: import timeit

In [53]: s1 = """
    ...: import pandas as pd
    ...: df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
    ...: del df['a']
    ...: """

In [54]: s2 = """
    ...: import pandas as pd
    ...: df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
    ...: df=df.drop('a',1)
    ...: """

In [55]: s3 = """
    ...: import pandas as pd
    ...: df=pd.DataFrame({'a':[1,2,3,4,5],'b':[6,7,8,9,10],'c':[11,12,13,14,15]})
    ...: df=df[['b','c']]
    ...: """

In [56]: timeit.timeit(stmt=s1, number=100000)
Out[56]: 53.37321400642395

In [57]: timeit.timeit(stmt=s2, number=100000)
Out[57]: 79.68139410018921

In [58]: timeit.timeit(stmt=s3, number=100000)
Out[58]: 76.25269913673401

2
由于您正在使用IPython,因此可以直接使用内置在IPython中的%timeit [魔法命令](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-timeit):`%timeit -n 100000 df = df.drop('a',1)`。 - YaOzI

2

我认为最好使用第2和第3个选项,因为第一个有限制——你只能删除一列,并且不能使用点符号 del df.a

第三种解决方案不是删除,而是选择,piRSquared提供了一个很好的答案,可以用相同的思路得到多种可能的解决方案。


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