【问题标题】:Append count of rows meeting a condition within a group to Pandas dataframe将组内满足条件的行数附加到 Pandas 数据帧
【发布时间】:2018-03-20 21:09:23
【问题描述】:

我知道如何append a column counting the number of elements in a group,但我只需要为该组中满足特定条件的号码这样做。

例如,如果我有以下数据:

import numpy as np
import pandas as pd

columns=['group1', 'value1']

data = np.array([np.arange(5)]*2).T
mydf = pd.DataFrame(data, columns=columns)

mydf.group1 = [0,0,1,1,2]
mydf.value1 = ['P','F',100,10,0]

valueslist={'50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','A','B','C','D','P','S'}

因此我的数据框如下所示:

mydf

   group1 value1
0       0      P
1       0      F
2       1    100
3       1     10
4       2      0

然后我想计算每个group1 值中的行数,其中value1valuelist 中。

我想要的输出是:

   group1 value1 count
0       0      P     1
1       0      F     1
2       1    100     1
3       1     10     1
4       2      0     0

【问题讨论】:

  • 我认为输出不清楚。为什么它是第 3 行的 1? (+1 提供良好的样本数据)
  • @AntonvBR 因为在group1 = 1 中只有 1 个 value1 值在 valuelist 中。你明白我的意思吗?我们在group1 的组中计算valuelist 中有多少行有value1 值。为了给你上下文,这些是班级组的成绩。所以value1 的值 100 是通过但 10 不是。因此count 表明选修课group1 组“1”中的1 课已通过。同样的事情也适用于group1 的组 0。一个有一个通过值 (P) 和一个失败 (F) 因此该组通过的总数是 1。

标签: python pandas


【解决方案1】:

在更改 value1 列的类型以匹配您的值列表(或相反)后,您可以使用 isin 获取 True/False 列,并使用 astype(int) 将其转换为 1 和 0。然后我们可以应用一个普通的 groupby 变换:

In [13]: mydf["value1"] = mydf["value1"].astype(str)

In [14]: mydf["count"] = (mydf["value1"].isin(valueslist).astype(int) 
                          .groupby(mydf["group1"]).transform(sum))

In [15]: mydf
Out[15]: 
   group1 value1  count
0       0      P      1
1       0      F      1
2       1    100      1
3       1     10      1
4       2      0      0

【讨论】:

  • 看起来很棒,非常感谢。由于valuelist 中有字符,我认为我们应该使用astype(str) 而不是astype(int)。这对我有用,再次感谢。
【解决方案2】:
mydf.value1=mydf.value1.astype(str)
mydf['count']=mydf.group1.map(mydf.groupby('group1').apply(lambda x : sum(x.value1.isin(valueslist))))
mydf
Out[412]: 
   group1 value1  count
0       0      P      1
1       0      F      1
2       1    100      1
3       1     10      1
4       2      0      0

数据输入:

valueslist=['50','51','52','53','54','55','56','57','58','59','60','61','62','63','64','65','66','67','68','69','70','71','72','73','74','75','76','77','78','79','80','81','82','83','84','85','86','87','88','89','90','91','92','93','94','95','96','97','98','99','100','A','B','C','D','P','S']

【讨论】:

    【解决方案3】:

    您可以按每个 group1 进行分组,然后使用转换来查找您的值是否在列表中的最大值。

    mydf['count'] = mydf.groupby('group1').transform(lambda x: x.astype(str).isin(valueslist).sum())
    
       group1 value1  count
    0       0      P      1
    1       0      F      1
    2       1    100      1
    3       1     10      1
    4       2      0      0
    

    【讨论】:

      【解决方案4】:

      这是一种方法,虽然是单线:

      mydf.merge(mydf.groupby('group1').apply(lambda x: len(set(x['value1'].values).intersection(valueslist))).reset_index().rename(columns={0: 'count'}), how='inner', on='group1')
      
      
         group1 value1  count
      0       0      P      1
      1       0      F      1
      2       1    100      1
      3       1     10      1
      4       2      0      0
      

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2017-09-15
        • 2013-03-27
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        相关资源
        最近更新 更多