gpt4 book ai didi

python - 如何在多重索引中排序和添加排名列?

转载 作者:太空宇宙 更新时间:2023-11-03 15:13:31 29 4
gpt4 key购买 nike

我有一个看起来像这样的 pandas 数据框 ( df3 )

df1 = pd.DataFrame({
"period": [1, 2, 3, 4] * 4,
"cat1": ["A"] * 8 + ["B"] * 8,
"cat2": (["X"] * 4 + ["Y"] * 4) * 2,
"amount": [100, 200, 300, 400, 110, 210, 310, 410, 120, 220, 320, 420, 130, 230, 330, 430],
"total": [1000] * 16
})
df2 = df1.copy()
df2.amount = df2.amount + 1
df3 = pd.concat([df1, df2])

我想做的是

  • 根据 cat1 的值进行分组, cat2 ,和period .
  • 过滤到最大 amount 的行每个组中的值(value)。
  • amount 对生成的数据帧进行排序在 ['cat1', 'cat2'] 定义的组内(不是period)。
  • ['cat1', 'cat2'] 定义的每个组中添加累积百分比列。即,如果组内有 4 个值,则分配最高值 0.25 ,第二个最高值被分配 0.5等等

我可以做前两部分

df4 = df3.groupby(['cat1', 'cat2', 'period']).agg({
"amount": "max"
})

但现在df4['cat1', 'cat2', 'period'] 上有一个多重索引我不知道如何在多重索引定义的组内进行排序,也不知道如何在这些组内添加累积计数。

我可以接受丢失多索引(无论如何我只是将这些数据插入到 SQL 表中),但我也不知道如何做到这一点,如果这样做会很有效的话。

我想要的结果是

cat1 cat2 period  amount  rank  percentage
A X 4 401 1 0.25
A X 3 301 2 0.50
A X 2 201 3 0.75
A X 1 101 4 1.00
A Y 4 411 1 0.25
A Y 3 311 2 0.50
A Y 2 211 3 0.75
B X 4 421 4 1.00
B X 3 321 1 0.25
B X 2 221 2 0.50
B X 1 121 3 0.75
A Y 1 111 4 1.00
B Y 4 431 1 0.25
B Y 3 331 2 0.50
B Y 2 231 3 0.75
B Y 1 131 4 1.00

(我实际上并不需要 rank 列,为了清楚起见,我只是将其留在那里。)

最佳答案

IIUC:

df4 = df3.groupby(['cat1', 'cat2', 'period']).agg({
"amount": "max"
})
df4.reset_index(inplace=True)
df4 = df4.sort_values(by=['cat1','cat2','amount'],ascending=[True,True,False])
df4 = df4.assign(percentage=df4.groupby(['cat1','cat2'])['amount'].apply(lambda x: (x.notnull().cumsum()/x.size)))
print(df4)

输出:

   cat1 cat2  period  amount  percentage
3 A X 4 401 0.25
2 A X 3 301 0.50
1 A X 2 201 0.75
0 A X 1 101 1.00
7 A Y 4 411 0.25
6 A Y 3 311 0.50
5 A Y 2 211 0.75
4 A Y 1 111 1.00
11 B X 4 421 0.25
10 B X 3 321 0.50
9 B X 2 221 0.75
8 B X 1 121 1.00
15 B Y 4 431 0.25
14 B Y 3 331 0.50
13 B Y 2 231 0.75
12 B Y 1 131 1.00

关于python - 如何在多重索引中排序和添加排名列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44053244/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com