这是输入数据:
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']
还是不行有人能帮忙吗
1条答案
按热度按时间gpfsuwkq1#
不要使用loop/iterrows,使用向量代码。
计算
groupby.cumsum
或您的值(每组的累积和),然后与每组的阈值(分配有map
)进行比较。如果总和≤阈值(le
),则分配1
,否则分配0
。输出:
中间体: