Как плотно ранжировать внутри группы с лимитом суммы? - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу group by кодировать и rank, но с условием, что если сумма контейнера превышает 2000, она должна быть помещена в следующую группу.Можно ли этого достичь в Пандах?

У меня есть следующие данные:

+---+----------+--+------------------+
| 1 | Load No. |  |  Code  Weight    |
| 2 | 1        |  |  4000   200      |
| 3 | 2        |  |  4000  1800      |
| 4 | 3        |  |  4000   400      |
| 5 | 4        |  |  4000   1000     |
| 6 | 5        |  |  5000   1000     |
| 7 | 6        |  |  5000   800      |
| 8 | 7        |  |  5000   1200     |
+---+----------+--+------------------+

Вывод:

| 1 | Load No. | Code  Weight Container Total Sum 
| 2 | 1        | 4000   200     1         2000 
| 3 | 2        | 4000   1800    1         2000 
| 4 | 3        | 4000   400     2         1400 
| 5 | 4        | 4000   1000    2         1400 
| 6 | 5        | 5000   1000    3         1800 
| 7 | 6        | 5000   800     3         1800 
| 8 | 7        | 5000   1200    4         1200 

1 Ответ

0 голосов
/ 27 декабря 2018

Один метод для получения Container

s=df.Weight.cumsum()/2000
pd.cut(s,np.arange(0,max(s)+1,1)).cat.codes+1
0    1
1    1
2    2
3    2
4    3
5    3
6    4
dtype: int8
df['container']=pd.cut(s,np.arange(0,max(s)+1,1)).cat.codes+1

Тогда мы используем transform

df['total sum']=df.groupby('container').Weight.transform('sum')
df
   LoadNo.  Code  Weight  container  total sum
0        1  4000     200          1       2000
1        2  4000    1800          1       2000
2        3  4000     400          2       1400
3        4  4000    1000          2       1400
4        5  5000    1000          3       1800
5        6  5000     800          3       1800
6        7  5000    1200          4       1200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...