【问题标题】:Filter a database groupby output without storing it in a variable过滤数据库 groupby 输出而不将其存储在变量中
【发布时间】:2021-12-01 14:25:45
【问题描述】:

我在 col1 中有一个带有 Person ID 的数据,它可以重复暗示同一个人的另一行。 col2 表示对于某些参数,该行(实例)是 Y 还是 N。

示例:

col1    col2
1       Y
1       Y
1       N
1       Y
1       N
2       Y
2       N
2       N
3       N
3       N
3       N
3       N

有一百万这样的行。

我需要得到那些只有 'N' 和他们的 'N' 计数的人的过滤输出。

所以我做了这样的事情:

data.groupby('col1')['col2'].value_counts().unstack(level=1)

这让我得到以下信息:

col1    Y    N
1       3    2
2       1    2
3       NaN  4

但我只需要第三行。

我尝试使用以下方法应用过滤器,但它们不起作用。

data.groupby('col1')['col2'].value_counts().unstack(level=1)['Y'.isna()]
data.groupby('col1')['col2'].value_counts().unstack(level=1).query("'Y'.isna()")

我知道如果不以data['Y'] 格式在其前面添加数据变量,我无法直接引用“Y”列。但我不希望将此 groupby 结果保存在新变量中。

我们有什么方法可以过滤输出而不将其保存到变量中?

例如:

data.groupby('col1')['col2'].value_counts().unstack(level=1)['Y'].isna().sum()

这会给我一些案例。但是,我也需要 col1 值。

【问题讨论】:

    标签: python python-3.x pandas dataframe filter


    【解决方案1】:

    去掉Y周围的引号:

    >>> data.groupby('col1')['col2'].value_counts().unstack(level=1).query("Y.isna()")
    col2    N   Y
    col1         
    3     4.0 NaN
    >>> 
    

    或者True:

    >>> x = data.groupby('col1')['col2'].value_counts().unstack(level=1)
    >>> x[x[True].isna()]
    col2  False  True 
    col1              
    3       4.0    NaN
    >>> 
    

    【讨论】:

    • 谢谢。如果案例是布尔值 True 和 False 而不是 Y 和 N,这会起作用吗? .query("False.isna()")
    • 到目前为止,我可以通过在 unstack 方法之后添加 .rename(columns={False:'N',True:'Y'}) 来解决此问题。请建议是否有其他方法。
    • col2 具有整数 0 和 1 而不是 Y 和 N 字符串的情况也是如此。
    • @Meet 编辑了我的答案
    • 那么,如果不将其存储到变量 x 中,就没有办法做到这一点,是吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 2018-08-07
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多