基于cumsum值对Pandas Dataframe 进行判别

iyfjxgzm  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(144)

如果我有这个 Dataframe :

RoomCode    Notes   Qty     sum    cumsum
4302    AGA      2A2K   14323   30613   14323
4301    AGA      2A1K   4810    30613   19133
4303    AGA      2A4K   4180    30613   23313
4306    AGA      2A5K   3759    30613   27072
4307    AGA      2A7K   1472    30613   28544
4304    AGA      2A8K    783    30613   29327
4311    AGA      2A9K    571    30613   29898
4310    AGA      2A10K   243    30613   30141
4312    AGA      2A11K   139    30613   30280

基于累计和,我想做一个类,它是这样工作的。如果累计和覆盖了95%的总和,那么它是类1。所以,总和是30613。那么30613的95%是29082.35。所以,指数4302到4307是类1。接下来的2,5%是在29082.5到29847.675之间(范围为总和的95%至97.5%)因此,4304至4311为2类。下一个列表为3类。

hgncfbus

hgncfbus1#

让我们使用Pandascut来基于bin对cumsum列进行分类

s  = df['sum'].iat[0] 

df['class'] = pd.cut(
    df['cumsum'], bins=[0, s * .95, s * .975, s],
    labels=[1, 2, 3], include_lowest=True
)

如果需要按代码分组,则按唯一代码组应用分类功能

def categorize(g):
   s  = g['sum'].iat[0] 
   return pd.cut(
        g['cumsum'], 
        bins=[0, s * .95, s * .975, s],
        labels=[1, 2, 3], include_lowest=True
    ) 

df['class'] =  df.groupby('Code', group_keys=False).apply(categorize)

结果

Code  Notes    Qty    sum  cumsum class
4302      AGA   2A2K  14323  30613   14323     1
4301      AGA   2A1K   4810  30613   19133     1
4303      AGA   2A4K   4180  30613   23313     1
4306      AGA   2A5K   3759  30613   27072     1
4307      AGA   2A7K   1472  30613   28544     1
4304      AGA   2A8K    783  30613   29327     2
4311      AGA   2A9K    571  30613   29898     3
4310      AGA  2A10K    243  30613   30141     3
4312      AGA  2A11K    139  30613   30280     3
zxlwwiss

zxlwwiss2#

你可以通过这个尝试代码实现你的目标解决方案:

import pandas as pd

data = {'Code': ['AGA', 'AGA', 'AGA', 'AGA', 'AGA', 'AGA', 'AGA', 'AGA', 'AGA'],
        'Notes': ['2A2K', '2A1K', '2A4K', '2A5K', '2A7K', '2A8K', '2A9K', '2A10K', '2A11K'],
        'Qty': [14323, 4810, 4180, 3759, 1472, 783, 571, 243, 139],
        'sum': [30613, 30613, 30613, 30613, 30613, 30613, 30613, 30613, 30613],
        'cumsum': [14323, 19133, 23313, 27072, 28544, 29327, 29898, 30141, 30280]}

df = pd.DataFrame(data)

df['class'] = 0

cumsum_95 = df['sum'][0] * 0.95
cumsum_97_5 = df['sum'][0] * 0.975

class_1 = df[df['cumsum'] <= cumsum_95].index
class_2 = df[(df['cumsum'] > cumsum_95) & (df['cumsum'] <= cumsum_97_5)].index

df.loc[class_1, 'class'] = 1
df.loc[class_2, 'class'] = 2
df.loc[df['cumsum'] > cumsum_97_5, 'class'] = 3

print(df)
    • 结果:**
Code  Notes    Qty    sum  cumsum  class
0      AGA   2A2K  14323  30613   14323      1
1      AGA   2A1K   4810  30613   19133      1
2      AGA   2A4K   4180  30613   23313      1
3      AGA   2A5K   3759  30613   27072      1
4      AGA   2A7K   1472  30613   28544      1
5      AGA   2A8K    783  30613   29327      2
6      AGA   2A9K    571  30613   29898      3
7      AGA  2A10K    243  30613   30141      3
8      AGA  2A11K    139  30613   30280      3

相关问题