pandas 应用和查询

epggiuax  于 2023-04-28  发布在  其他
关注(0)|答案(1)|浏览(78)

这是输入数据:

data=pd.DataFrame({'Name':['a','b','c','d','e','f','g','h','i'],
              'Group':['G1','G3','G2','G1','G2','G3','G1','G2','G3'],
              'Value':[15,21,14,8,17,22,11,13,15]})

data=data.sort_values('Value',ascending=False)

我希望创建一个名为“Weight”的列,根据其他列为每个条目提供1或0:
1.我对“值”列进行排序
1.对于每个“组”,我给予一个预算。如果总和超过预算,所有剩余条目的“权重”将为0
预期输出:

data_out=pd.DataFrame({'Name':['a','b','c','d','e','f','g','h','i'],
              'Group':['G1','G3','G2','G1','G2','G3','G1','G2','G3'],
              'Value':[15,21,14,8,17,22,11,13,15],
              'Weight':[1,0,1,0,1,1,1,0,0]})

我们如何获得此权重的说明性示例是:
G1的阈值为27(参见下面的字典),a是15,小于27,它被分配了权重1,接下来g是11,所以总数是15+11=26〈27,所以b也将被分配为权重1. d是8,如果加上它将超过27的预算所以它的权重为0。同样的逻辑适用于G2和G3。

threshold_dic={'G1':27,'G2':32,'G3':25}

initial_dic={'G1':0,'G2':0,'G3':0}

def f(row):
    
    if initial_dic[row['Group']]<= threshold_dic[row['Group']]:
        
        row['Weight']=1
        
    else:
        
        row['Weight']=0
        
    initial_dic[row['Group']]+=row['Value']
    
    return row

data.apply(f,axis=0)

它抛出了一个错误。我也尝试了这个:

for i in data.iterrows():
    
    if initial_dic[row['Group']]<= threshold_dic[row['Group']]:
        
        row['Weight']=1
        
    else:
        
        row['Weight']=0
        
    initial_dic[row['Group']]+=row['Value']

还是不行有人能帮忙吗

gpfsuwkq

gpfsuwkq1#

不要使用loop/iterrows,使用向量代码。
计算groupby.cumsum或您的值(每组的累积和),然后与每组的阈值(分配有map)进行比较。如果总和≤阈值(le),则分配1,否则分配0

data['Weight'] = (data
 .groupby('Group')['Value'].cumsum()
 .le(data['Group'].map(threshold_dic))
 .astype(int)
)

输出:

Name Group  Value  Weight
5    f    G3     22       1
1    b    G3     21       0
4    e    G2     17       1
0    a    G1     15       1
8    i    G3     15       0
2    c    G2     14       1
7    h    G2     13       0
6    g    G1     11       1
3    d    G1      8       0

中间体:

Name Group  Value  cumsum  threshold  cumsum ≤ threshold  Weight
5    f    G3     22      22         25                True       1
1    b    G3     21      43         25               False       0
4    e    G2     17      17         32                True       1
0    a    G1     15      15         27                True       1
8    i    G3     15      58         25               False       0
2    c    G2     14      31         32                True       1
7    h    G2     13      44         32               False       0
6    g    G1     11      26         27                True       1
3    d    G1      8      34         27               False       0

相关问题