Python 将组内满足条件的行数追加到数据帧

Python 将组内满足条件的行数追加到数据帧,python,pandas,Python,Pandas,我知道怎么做,但我需要这样做,只是为了该组中满足特定条件的数字 例如,如果我有以下数据: 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

我知道怎么做,但我需要这样做,只是为了该组中满足特定条件的数字

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

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
位于
valuelist
中的行数

我期望的输出是:


在更改value1列的类型以匹配您的valueslist(或其他方式)后,您可以使用
isin
获取真/假列,并使用
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

您可以按每个group1分组,然后使用transform查找值是否在列表中的最大值

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
数据输入:

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.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

我认为输出不清楚。为什么第三排是1?(+1用于提供良好的样本数据)@AntonvBR,因为
值列表中的
组1
=
1
中只有1个
value1
值。你明白我的意思吗?我们正在计算
group1
组中
value1
值在
valuelist
中的行数。为了给你上下文,这些是班级分组的分数。因此,
value1
值100正在通过,但10没有通过。因此,
count
显示,
group1
group1选修课中的1个班已经通过。同样的情况也适用于
group1
的组0。其中一个值为通过值(
P
),另一个值为失败(
F
),因此该组的通过总数为1。看起来很棒,非常感谢。由于
值列表中有字符
我认为我们应该使用
astype(str)
而不是
astype(int)
。这对我有用,再次谢谢。
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']
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