【问题标题】:What is the best way to remove columns in pandas删除熊猫中的列的最佳方法是什么
【发布时间】:2018-07-04 07:01:02
【问题描述】:

我提出这个问题是为了自学。据我所知,以下是删除 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. 还有其他方法可以达到同样的效果吗?

【问题讨论】:

  • Option-2 是最常见的。这是从数据框中删除列的熊猫方式。

标签: python pandas dataframe


【解决方案1】:

关注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']])。

【讨论】:

    【解决方案2】:

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

    要删除一列,

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

    要删除一行,

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 由于你使用的是IPython,你可以使用IPython内置的%timeitmagic command%timeit -n 100000 df=df.drop('a',1)
      【解决方案4】:

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

      3.solution 不是删除,而是选择和piRSquared 为具有相同想法的多个可能解决方案创建不错的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 2011-10-03
        • 2015-06-05
        相关资源
        最近更新 更多