【问题标题】:Pandas groupby where one of the group values is in a rangePandas groupby,其中一个组值在一个范围内
【发布时间】:2021-03-15 21:28:28
【问题描述】:

我想找出至少有一行带有0.5 < C < 1.0 的组的大小。给定这样的数据框:

A B C
1 2 0.1
1 2 0.9
1 2 1.0
2 5 0
2 5 0.1
2 5 0.2
3 4 0.6

我希望看到类似以下内容的返回:

A B Size
1 2 3
3 4 1

我尝试了以下方法:

group = dataset.groupby(['A', 'B'])
filtered = group.filter(lambda x: 0.5 < x['C'] < 1.0)
filtered.size()

但是,我在第二行收到此错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

any() 函数在这种情况下是有意义的,因为我希望 Cany 值介于 0.5 和 1.0 之间以便计算该组,但我不知道在哪里拨打any() 电话。我尝试在 lambda 上调用它。我在filter() 之后尝试过。我尝试的任何方法都不起作用...

【问题讨论】:

  • @Kris 不会只给我返回0.5 &lt; C &lt; 1.0 的行吗?我希望 all 他们的组至少有一行 0.5 &lt; C &lt; 1.0.
  • 如果你的左约束是&lt;=,你可以使用.between()。所以df["C"].between(0.5, 1, inclusive=False)

标签: python pandas dataframe pandas-groupby


【解决方案1】:
df["tmp"] = (df["C"] > 0.5) & (df["C"] < 1.0)
g = df.groupby(["A", "B"])
print(g.size()[g["tmp"].sum() > 0])

打印:

A  B
1  2    3
3  4    1
dtype: int64

【讨论】:

    【解决方案2】:

    groupby的布尔索引中使用any

    df.groupby(['A','B']).size()[df.groupby(['A','B']).apply(lambda g:((g['C'] > 0.5) & (g['C'] < 1.0)).any())]
    

    打印

    A  B
    1  2    3
    3  4    1
    dtype: int64
    

    【讨论】:

    • 那是我需要放置any()的地方!
    • :-) 感谢投票,很高兴它帮助解决了 any() 问题!可以说,其他一些解决方案更优雅
    【解决方案3】:

    我们可以sum

    out = df.C.between(.5,1).groupby([df['A'],df['B']]).sum().loc[lambda x : x!=0]
    Out[180]: 
    A  B
    1  2    2
    3  4    1
    Name: C, dtype: int64
    

    【讨论】:

      【解决方案4】:
      df.groupby(['A', 'B']).agg(
          {'C': lambda x: len(x) if np.logical_and(0.5 < x.values,  x.values < 1.).sum() else None}
      ).dropna().astype(int).rename(columns={'C': 'size'})
      
           size
      A B      
      1 2     3
      3 4     1
      
      

      或者,如果您更喜欢 AB 作为列:

      df.groupby(['A', 'B']).agg(
          {'C': lambda x: len(x) if np.logical_and(0.5 < x.values,  x.values < 1.).sum() else None}
      ).dropna().astype(int).rename(columns={'C': 'size'}).reset_index()
      
         A  B  size
      0  1  2     3
      1  3  4     1
      

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多