我正在为自己的学习提出这个问题。据我所知,以下是删除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']]
答案 0 :(得分:10)
关注doc:
DataFrame是具有两个不同类型列的二维标签数据结构。
从行或列中拖放指定的标签。
因此,我认为我们应该坚持使用df.drop
。为什么?我认为优点是:
它为我们提供了对删除操作的更多控制:
# 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)
它可以使用args处理更复杂的情况。例如。使用level
,我们可以处理MultiIndex删除。借助errors
,我们可以防止某些错误。
这是一种更加统一和面向对象的方式。
就像@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