我有一个pandas数据框,想要摆脱列中的一行' A'是否定的。我知道有两种方法可以做到这一点:
df = df[df['A'] >= 0]
或
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
推荐的解决方案是什么?为什么呢?
答案 0 :(得分:2)
你的问题是这样的:“我有两个相同的蛋糕,但有一个有糖衣。哪个有更多的卡路里?”
第二种解决方案是做同样的事情,但两次。过滤步骤就足够了,不需要过滤,然后然后冗余地继续调用一个函数,它完成与前一步骤中的过滤操作完全相同的操作。
澄清一下:无论操作如何,你仍然在做同样的事情:生成一个布尔掩码,然后进行索引。
答案 1 :(得分:1)
推荐的解决方案是最有效的,在这种情况下,是第一个。
df = df[df['A'] >= 0]
关于第二个解决方案
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
你正在重复切片过程。但是让我们把它分解成碎片来理解原因。
写作时
df['A'] >= 0
你正在创建一个蒙版,一个布尔系列,每个df索引都带有一个条目,根据条件,它的值为True或False(在这种情况下,如果是这样的列的值&#39; A&#39 ;在给定的索引处大于或等于0)。
写作时
df[df['A'] >= 0]
您访问掩码(df [&#39; A&#39;]&gt; = 0)为True的行。这是Pandas支持的切片方法,允许您通过传递布尔系列来选择某些行,并返回一个新的DataFrame,其中只包含Series为True的条目。
最后,当你写这个
selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)
你正在重复过程,因为
df[df['A'] < 0]
已经在对您的DataFrame进行切片(在这种情况下,您要放弃的行)。然后,您将获取这些索引,返回到原始DataFrame并显式删除它们。不需要这个,你已经在第一步切片了DataFrame。
答案 2 :(得分:0)
df = df[df['A'] >= 0]
确实是更快的解决方案。请注意,它返回原始数据帧的视图,而不是新数据帧。这可能会给您带来麻烦,例如,当您想更改其值时,大熊猫会给您SettingwithCopyWarning
。
Wen-Ben推荐的当然是简单的解决方法:
df = df[df['A'] >= 0].copy()