首页 > 解决方案 > 通过添加新列的条件总和值

问题描述

通过一些代码,我已经想到了对原始数据库的这种减少。列STA_SID可以有不同的值,有些可以重复。列CC_SI只能有三个值ESS-VSSOstali nameni

我想做的最后一件事是:添加一个新列,其中对于 中的每个唯一值,对于三个可能值中的每一个STA_SID,逐sum列中的值,对于一个,其中值占整个值的 50%以上, 分配那个.AuCC_SIAuSTA_SIDCC_SI

     STA_SID          CC_SI     Au
0   10001082  Ostali nameni  226.9
1   10001082            VSS  164.9
2   10001087  Ostali nameni   13.5
3   10001089  Ostali nameni   48.6
4   10001092  Ostali nameni   49.5
5   10001093            ESS  151.9
6   10001094  Ostali nameni    8.0
7   10001098  Ostali nameni   18.0
8   10001112  Ostali nameni   61.0
9   10001113  Ostali nameni   49.5
10  10001115            ESS   89.1
11  10001116            ESS   78.0
12  10001117            ESS  103.0
13  10001118            ESS   70.0
14  10001121            ESS  102.2

例子:

CC_SI= 10001082

总和Au= 226,9 + 164,9 = 391,8

Au等于391,8Ostali nameni的50% 以上。STA_SID = 10001082226,9

最终的 df 看起来像这样STA_SID = 10001082

     STA_SID          CC_SI     Au            NewColumn
0   10001082  Ostali nameni  226.9       Ostali nameni
1   10001082            VSS  164.9       Ostali nameni


我试图用一行来快速写这个,lambda但我无法对其他行的值求和。有人可以帮忙吗?

标签: pythonpandasgroup-by

解决方案


您应该能够以这种方式找到它,通过获取每个记录与其组相比的 Au 比例,确定哪个记录将确定其组的 CC_SI,然后将该值应用回每个组。

df['Au_Proportion'] = df['Au']/df['Au'].groupby(df["STA_SID"]).transform('sum')
df['Majority'] = df['Au_Proportion'].apply(lambda x: 1 if x >.5 else 0)
df['Group_CC_SI'] = df.apply(lambda x: df['CC_SI'].loc[(df['Majority']==1)&(df['STA_SID']==x['STA_SID'])].values[0],axis=1)

推荐阅读