希望学习如何以更优雅的方式编写此解决方案。需要将一组行拆分为较小的部分并控制利用率以及计算余额。当前的解决方案无法正确生成余额
import pandas as pd
import numpy as np
box_list = [['Box0', 0.2],
['Box1', 1.0],
['Box2', 1.8],
['Box4', 2.0],
['Box8', 4.01],]
sdf = pd.DataFrame(box_list, columns = ['Name', 'Size'])
print(sdf)
|
姓名 |
尺寸 |
| 1 |
盒子1 |
1.00 |
| 2 |
方框2 |
1.80 |
| 3 |
方框4 |
2.00 |
| 4 |
Box8 |
4.01 |
df = pd.DataFrame({'Name': np.repeat(sdf['Name'], sdf['Size'].apply(np.ceil)),
'Size': np.repeat(sdf['Size'], sdf['Size'].apply(np.ceil)),})
df['Max_Units']=df['Size'].apply(lambda x: np.ceil(x) if x>1.0 else 1.0)
df = df.reset_index()
df['Utilization'] =df['Size'].apply(lambda x: x-int(x) if x>1.0 else (x if x<1.0 else 1.0))
df['Balance'] =df['Max_Units']
g = df.groupby(['index'], as_index=0, group_keys=0)
df['Utilization'] = g.apply(lambda x:
pd.Series(np.where((x.Balance.shift(1) >= 1.0),
1.0,
x.Utilization))).values
df.loc[(df.Utilization == 0.0), ['Utilization']] = 1.0
df['Balance'] = g.apply(lambda x:
pd.Series(np.where((x.Balance.shift(1) >= 1.0),
x.Max_Units-x.Utilization,
0))).values
print(df)
|
指数 |
姓名 |
尺寸 |
Max_Units |
利用率 |
平衡 |
| 0 |
0 |
盒子0 |
0.20 |
1.0 |
0.20 |
0.0 |
| 1 |
1 |
盒子1 |
1.00 |
1.0 |
1.00 |
0.0 |
| 2 |
2 |
方框2 |
1.80 |
2.0 |
0.80 |
0.0 |
| 3 |
2 |
方框2 |
1.80 |
2.0 |
1.00 |
1.0 |
| 4 |
3 |
方框4 |
2.00 |
2.0 |
1.00 |
0.0 |
| 5 |
3 |
方框4 |
2.00 |
2.0 |
1.00 |
1.0 |
| 6 |
4 |
Box8 |
4.01 |
5.0 |
0.01 |
0.0 |
| 7 |
4 |
Box8 |
4.01 |
5.0 |
1.00 |
4.0 |
| 8 |
4 |
Box8 |
4.01 |
5.0 |
1.00 |
4.0 |
| 9 |
4 |
Box8 |
4.01 |
5.0 |
1.00 |
4.0 |
| 10 |
4 |
Box8 |
4.01 |
5.0 |
1.00 |
4.0 |