pandas 使用可变数量的或语句

13 浏览
0 Comments

pandas 使用可变数量的或语句

看起来不美观:\n

df_cut = df_new[
             (
             (df_new['l_ext']==31) |
             (df_new['l_ext']==22) |
             (df_new['l_ext']==30) |
             (df_new['l_ext']==25) |
             (df_new['l_ext']==64)
             )
            ]

\n无法工作:\n

df_cut = df_new[(df_new['l_ext'] in [31, 22, 30, 25, 64])]

\n是否存在一个优雅且有效的解决上述“问题”的方法?

0
0 Comments

pandas使用变量数量的or语句

在处理pandas数据框时,有时候需要根据一些特定条件筛选数据。在某些情况下,我们可能需要使用变量数量的or语句,即根据一组值来筛选数据。

pandas提供了一种使用变量数量的or语句的方法,即使用`pd.DataFrame.query`函数。该函数的作用是根据指定的条件筛选数据。下面是一个示例代码:

select_values = [31, 22, 30, 25, 64]
df_cut = df_new.query('l_ext in select_values')

在这个示例中,我们通过将变量`select_values`作为查询条件的一部分,实现了使用变量数量的or语句来筛选数据。

背后的实现原理是使用了顶层函数`pd.eval`。这个函数可以执行字符串形式的表达式,实现数据的筛选。

除了使用额外的变量之外,还有一种不需要创建额外变量的替代方法。可以使用`df_new.query('l_ext.isin([31, 22, 30, 25, 64]).values')`来实现相同的功能。

通过以上方法,我们可以根据变量数量的or语句来筛选pandas数据框中的数据,实现更加灵活的数据处理。

0
0 Comments

在使用pandas的过程中,有时我们需要根据多个条件来筛选数据。而其中一个常见的问题是如何使用变量数量的或语句来实现筛选。解决这个问题的方法是使用isin函数。

isin函数的用法如下:

df_new[df_new['l_ext'].isin([31, 22, 30, 25, 64])]

通过在方括号中传入一个列表,我们可以筛选出'l_ext'列中包含列表中任意元素的行。

然而,isin函数的负面之处是我们无法直接使用它的反操作。也就是说,我们无法通过传递一个列表来筛选出不包含列表中任意元素的行。

为了解决这个问题,我们可以使用numpy库中的logical_not函数,它可以对isin函数的结果取反。具体代码如下:

numpy.logical_not(df_new['l_ext'].isin([31, 22, 30, 25, 64]))

另外,pandas的作者也提供了另一种方法,可以参考stackoverflow上的这个问题:

stackoverflow.com/questions/14057007

除此之外,我们还可以使用~符号来对isin函数的结果取反。具体代码如下:

df_new[~df_new['l_ext'].isin([31, 22, 30, 25, 64])]

需要注意的是,如果列的数据类型不明确,比如是"object"类型,它既可以是数字也可以是字符串,那么isin函数会自动推断数据类型。在使用时要小心。

0