熊猫掉落行与过滤器

时间:2018-06-04 22:52:56

标签: python pandas dataframe data-science

我有一个pandas数据框,想要摆脱列中的一行' A'是否定的。我知道有两种方法可以做到这一点:

df = df[df['A'] >= 0]

selRows = df[df['A'] < 0].index
df = df.drop(selRows, axis=0)

推荐的解决方案是什么?为什么呢?

3 个答案:

答案 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()