使用transform在数据帧中计算特定值并聚合结果

2024-05-19 12:52:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个与此类似的数据帧:

    Errorid  Matricule Priority
0      1        01       P1
1      2        01       P2
2      3        01       NC
3      4        02       P1
4      5        02       P4
5      6        02       EDC
6      7        02       P2

该列表列出了矩阵的所有错误及其优先级

我要做的是计算矩阵的所有错误,同时排除“NC”和“EDC”,并将结果放入相同的数据框中

结果示例:

    Errorid  Matricule Priority  NberrorsMatricule
0      1        01       P1           2
1      2        01       P2           2
2      3        01       NC           2
3      4        02       P1           3
4      5        02       P4           3
5      6        02       EDC          3
6      7        02       P2           3

我尝试了以下多种方法:

DF['NberrorsMatricule'] = DF.groupby('Matricule')['Pirority'].transform(lambda x : x.count() if x in ['P1','P2','P3','P4']) 

DF['NberrorsMatricule'] = DF.groupby('Matricule')[DF['Pirority'] in ['P1','P2','P3','P4']].transform("count")

每次我得到一个不明确的值错误。 ValueError:序列的真值不明确。使用a.empty()、a.bool()、a.item()、a.any()、a.all()

请注意,这一项工作:

DF['NberrorsMatricule'] = DF.groupby('Matricule')['Pirority'].transform("count") 

但它显然没有过滤出优先权

这些dataframe就是一个例子,事实上,我处理的数据量很大(这一次超过400k) 所以 如果有人能帮助我理解transform()的行为,以及如何有效地过滤数据,那将非常好

提前谢谢你的帮助


Tags: 数据dfcount错误transformedcp2nc
2条回答

像这样:

In [567]:  df['NberrorsMatricule'] = df[~df.Priority.isin(['NC', 'EDC'])].\ 
     ...:                               groupby('Matricule')['Errorid']\ 
     ...:                               .transform('count')                                                                          

要删除Nan,请使用ffill():

In [595]: df['NberrorsMatricule'] = df['NberrorsMatricule'].ffill()                                                                                                                                         

In [596]: df                                                                                                                                                                                                
Out[596]: 
   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                2.0
1        2          1       P2                2.0
2        3          1       NC                2.0
3        4          2       P1                3.0
4        5          2       P4                3.0
5        6          2      EDC                3.0
6        7          2       P2                3.0

您可以使用^{}^{}将不匹配的值替换为缺少的值,因此,如果使用^{}^{},则会排除缺少的值:

L = ['P1','P2','P3','P4']
df['NberrorsMatricule'] = (df['Priority'].where(df['Priority'].isin(L))
                                         .groupby(df['Matricule'])
                                         .transform('count'))
print (df)
   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                  2
1        2          1       P2                  2
2        3          1       NC                  2
3        4          2       P1                  3
4        5          2       P4                  3
5        6          2      EDC                  3
6        7          2       P2                  3

详细信息

print (df['Priority'].where(df['Priority'].isin(L)))
0     P1
1     P2
2    NaN
3     P1
4     P4
5    NaN
6     P2
Name: Priority, dtype: object

另一种解决方案是通过sum对匹配值进行计数,以便将TrueFalse转换为1, 0可以使用^{}^{}

df['NberrorsMatricule'] = (df['Priority'].isin(L)
                                         .view('i1')
                                         .groupby(df['Matricule'])
                                         .transform('sum'))
print (df)

   Errorid  Matricule Priority  NberrorsMatricule
0        1          1       P1                  2
1        2          1       P2                  2
2        3          1       NC                  2
3        4          2       P1                  3
4        5          2       P4                  3
5        6          2      EDC                  3
6        7          2       P2                  3

相关问题 更多 >