【问题标题】:Pandas count number in one column based off a condition in a different columnPandas 根据另一列中的条件计算一列中的数字
【发布时间】:2020-11-09 01:47:55
【问题描述】:

在注册 > 0 的情况下,我需要计算 id 出现的次数。这就是我到目前为止所拥有的......关于如何做到这一点的任何想法?谢谢!

raw_data = [['a', '0'], ['a', '0'], ['a', '1'], ['b', '0'], ['b', '0.5'], ['c', '0'], ['c', '0']]
df = pd.DataFrame(raw_data, columns = ['id', 'enroll'])
df

def countidsperenroll():
    for i in df['id']:
        if (enroll>0):
            return value.count()
        continue 

结果应该是一个包含以下内容的表格: 价值观:

3
2
0

因为有 3 个 'a' id 并且有一个 enroll> 0 和 'a' id 之一。因为有 2 个 'b' id,并且有一个 enroll > 0 和其中一个 'b' id。 'c' id 没有'enroll',所以得到一个 0。

【问题讨论】:

    标签: python pandas loops for-loop if-statement


    【解决方案1】:

    我们可以通过value_counts 分两步完成

    s=df.id.value_counts()
    s.loc[~s.index.isin(df.loc[df.enroll>0,'id'].unique())]=0
    s
    a    3
    c    0
    b    2
    Name: id, dtype: int64
    

    【讨论】:

      【解决方案2】:
      df.groupby("id").filter(lambda x: (x["enroll"]>0).any()).groupby("id").count()
      

      首先你 groupby 过滤掉至少一个注册大于 0 的组,然后再 groupy 获取聚合数据。

      【讨论】:

        【解决方案3】:

        您可以使用这样一个事实,即如果登记大于 0,那么每组的总和将大于 0:

        (
            df.assign(temp=df.groupby("id").enroll.transform("sum").gt(0))
            .groupby("id")
            .temp.sum()
        )
        
        id
        a    3.0
        b    2.0
        c    0.0
        Name: temp, dtype: float64
        

        【讨论】:

          猜你喜欢
          • 2019-08-27
          • 2021-11-07
          • 1970-01-01
          • 2018-07-30
          • 2021-03-02
          • 2020-08-20
          • 2022-01-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多