删除熊猫中的列的最佳方法是什么

时间:2018-07-04 07:01:03

标签: python pandas dataframe

我正在为自己的学习提出这个问题。据我所知,以下是删除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. 还有其他方法可以实现相同目标吗?

4 个答案:

答案 0 :(得分:10)

关注doc

  

DataFrame是具有两个不同类型列的二维标签数据结构

还有pandas.DataFrame.drop

  

从行或列中拖放指定的标签

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

  1. 它为我们提供了对删除操作的更多控制:

    # 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. 它可以使用args处理更复杂的情况。例如。使用level,我们可以处理MultiIndex删除。借助errors,我们可以防止某些错误。

  3. 这是一种更加统一和面向对象的方式。


就像@jezrael在回答中指出的那样:

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

选项3:df=df[['b','c']]本质上甚至不是删除。它首先使用[]语法select data by indexing,然后将名称df与原始DataFrame绑定,然后将其与新的DataFrame(即df[['b','c']])绑定。

答案 1 :(得分:1)

我认为最好是使用2.和3.选项,因为第一个有限制-您只能删除一个列和cannot use dot notation-del df.a

3.solution并没有删除,但是选择和piRSquared为具有相同想法的多个可能的解决方案创造了很好的答案。

答案 2 :(得分:1)

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

要删除列,

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

要删除行,

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

您可以参考this post来查看有关列删除方法的详细讨论。

答案 3 :(得分:1)

从速度角度来看,选项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