【问题标题】:Python dfply: unable to mask on multiple conditionsPython dfply:无法在多个条件下屏蔽
【发布时间】:2018-06-19 10:45:41
【问题描述】:

我是一名 R 用户,正在学习如何使用 Python 的 dfply,Python 相当于 R 的 dplyr。我的问题:在 dfply 中,我无法屏蔽管道中的多个条件。我寻求涉及 dfply 管道而不是多行子集的解决方案。

我的代码:

# Import
import pandas as pd
import numpy as np
from dfply import *

# Create data frame and mask it
df  = pd.DataFrame({'a':[np.nan,2,3,4,5],'b':[6,7,8,9,np.nan],'c':[5,4,3,2,1]})
df2 = (df >>
        mask((X.a.isnull()) | ~(X.b.isnull())))
print(df)
print(df2)

这里是原始数据框,df:

       a    b    c
    0  NaN  6.0  5
    1  2.0  7.0  4
    2  3.0  8.0  3
    3  4.0  9.0  2
    4  5.0  NaN  1

这是管道掩码的结果,df2:

         a    b    c
      0  NaN  6.0  5
      4  5.0  NaN  1

但是,我希望这样:

         a    b    c
      0  NaN  6.0  5
      1  2.0  7.0  4
      2  3.0  8.0  3
      3  4.0  9.0  2

为什么不用“|”和“~”运算符会导致列“a”是either NaN 或列“b”不是 NaN 的行?

对了,我也试过np.logical_or():

df  = pd.DataFrame({'a':[np.nan,2,3,4,5],'b':[6,7,8,9,np.nan],'c':[5,4,3,2,1]})
df2 = (df >>
        mask(np.logical_or(X.a.isnull(),~X.b.isnull())))
print(df)
print(df2)

但这导致了错误:

mask(np.logical_or(X.a.isnull(),~X.b.isnull())))
ValueError: invalid __array_struct__

【问题讨论】:

    标签: python logical-operators dfply


    【解决方案1】:

    编辑:将第二个条件调整为“df.col2.notnull()”。不知道为什么在管道之后忽略波浪号。

    df  = pd.DataFrame({'a':[np.nan,2,3,4,5],'b':[6,7,8,9,np.nan],'c':[5,4,3,2,1]})
    df2 = (df >> mask((X.a.isnull()) | (X.b.notnull())))
    
    print(df2)
    
         a    b  c
    0  NaN  6.0  5
    1  2.0  7.0  4
    2  3.0  8.0  3
    3  4.0  9.0  2
    

    【讨论】:

    • 你能解释一下你的答案吗?
    • 非常感谢 CurlyW。这样可行。但是你知道为什么这个原始逻辑不起作用......:df2 = (df >> mask((X.a.isnull()) | ~(X.b.isnull())))......?似乎dfply 忽略了| 之后的~。我想确信我可以在 dfply 掩码中应用标准布尔运算符,因为 notnull() 的等价物可能并不总是存在。对了,我试过or,结果报错了。
    【解决方案2】:

    filter_by怎么样?

    df >> filter_by((X.a.isnull()) | (X.b.isnull()))
    

    【讨论】:

    • 嗨@loveactualry。这里的挑战是 dfply 无法识别我原始代码中 OR (|) 右侧的 ~ 。在您的建议中,当我将 (X.b.isnull())) 更改为 ~(X.b.isnull())) 我仍然得到以下结果: a b c 0 NaN 6.0 5 4 5.0 NaN 1 ...这不是我所期望的。相反,我期望: a b c 0 NaN 6.0 5 1 2.0 7.0 4 2 3.0 8.0 3 3 4.0 9.0 2
    • 哦,对不起...我会再试一次。
    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多