我有以下数据框架:
data = {'X':[0,0,10,10,10,15,20,50,50,55,80,100,1500]}
df=pd.DataFrame(data)
df
X
0 0
1 0
2 10
3 10
4 10
5 15
6 20
7 50
8 50
9 55
10 80
11 100
12 1500
另外,我有这4个参数:
A_Bucket=10
B_Bucket=50
C_Bucket=100
D_Bucket=300
X→列运行。我想创建4个新列(A,B,C,D),这将基于X列和基于4个参数,通过以下逻辑:一个→将从X到A的数量相加将得到与A_Bucket相同的值。一旦它到达它,我们需要移动到下一列。B→将从X到B的数量相加将得到与B_Bucket相同的值。一旦它到达它,我们需要移动到下一列。C和D也一样。A、B、C、D的和应该总是小于或等于x。
输出应该像这样:
Index X A B C D
1 0 0 0 0 0
2 0 0 0 0 0
3 10 10 0 0 0
4 10 10 0 0 0
5 10 10 0 0 0
6 15 10 5 0 0
7 20 10 10 0 0
8 50 10 40 0 0
9 50 10 40 0 0
10 55 10 45 0 0
11 80 10 50 20 0
12 100 10 50 40 0
13 1500 10 50 100 300
值得一提的是,这只是一个例子,我需要通过这个逻辑创建更多的列,所以我需要它尽可能有效。提前谢谢。
您可以使用where
子句通过每次从X中减去当前值的总量来实现这一点。
df = df.set_index("X")
for x, y in zip("ABCD", [A_Bucket, B_Bucket, C_Bucket, D_Bucket]):
df[x] = (df.index-df.sum(1)).where((df.index-df.sum(1)).le(y), y)
print (df)
A B C D
X
0 0.0 0.0 0.0 0.0
0 0.0 0.0 0.0 0.0
10 10.0 0.0 0.0 0.0
10 10.0 0.0 0.0 0.0
10 10.0 0.0 0.0 0.0
15 10.0 5.0 0.0 0.0
20 10.0 10.0 0.0 0.0
50 10.0 40.0 0.0 0.0
50 10.0 40.0 0.0 0.0
55 10.0 45.0 0.0 0.0
80 10.0 50.0 20.0 0.0
100 10.0 50.0 40.0 0.0
1500 10.0 50.0 100.0 300.0