gpt4 book ai didi

python - Pandas :对行组而不是单个行进行排序

转载 作者:行者123 更新时间:2023-11-28 20:37:30 26 4
gpt4 key购买 nike

我正在尝试找到一种基于列对对数据进行排序的方法。我下面的当前代码非常接近,但我最终想将 Joe 移到顶部 - 并将他的所有行放在一起 - 因为他的总数是最大的。

更新 1: 'Total' 不会总是最大值 - 因此它需要使用 'Yes' 指定 -(一些的美元数额可能是负的)。

更新 2:我的代码和所需的输出已更新,以显示 'Total' 行可能少于另一个 'Dollar' 在组中(由于美元为负数),但它仍然应该是该 'Dude' 组的第一行。

我的代码得到了正确的分组,但最终没有对 'Dude' 组进行排序。

import pandas as pd

headers = ['Date','Dude','Dollar', 'Total']
df = pd.DataFrame({
'Dude':['Bob','Bob','Sam','Bob','Joe','Joe','Joe','Bob','Sam','Sam','Joe','Sam'],
'Dollar':[4,1,-2,1,5,12,3,2,7,1,4,8],
'Total':['Yes','No','No','No','No','Yes','No','No','Yes','No','No','No'],
'Date':['1/1/2016','1/1/2016','1/1/2016','3/1/2016','3/1/2016','1/1/2016','1/1/2016','5/1/2016','1/1/2016','3/1/2016','5/1/2016','5/1/2016']
}, columns = headers)

df['Date'] = pd.to_datetime(df['Date'])

df.sort_values(by = ['Dude','Total','Date'], ascending = [True, False, True], inplace = True)

输出:

         Date Dude  Dollar Total
0 2016-01-01 Bob 4 Yes
1 2016-01-01 Bob 1 No
3 2016-03-01 Bob 1 No
7 2016-05-01 Bob 2 No
5 2016-01-01 Joe 12 Yes
6 2016-01-01 Joe 3 No
4 2016-03-01 Joe 5 No
10 2016-05-01 Joe 4 No
8 2016-01-01 Sam 7 Yes
2 2016-01-01 Sam -2 No
9 2016-03-01 Sam 1 No
11 2016-05-01 Sam 8 No

期望的输出:

         Date Dude  Dollar Total
5 2016-01-01 Joe 12 Yes
6 2016-01-01 Joe 3 No
4 2016-03-01 Joe 5 No
10 2016-05-01 Joe 4 No
8 2016-01-01 Sam 7 Yes
2 2016-01-01 Sam -2 No
9 2016-03-01 Sam 1 No
11 2016-05-01 Sam 8 No
0 2016-01-01 Bob 4 Yes
1 2016-01-01 Bob 1 No
3 2016-03-01 Bob 1 No
7 2016-05-01 Bob 2 No

最佳答案

您可以将“Dude”列设置为具有所需顺序的分类数据类型,然后像以前一样进行排序。这还会给您带来将“Dude”列作为分类列的其他好处。

# Get the ordering of Dudes based on max dollar.
dude_order = df[df['Total'] == 'Yes'].sort_values(by='Dollar', ascending=False)

# Set dude as categorical with the previously determined ordering.
df['Dude'] = df['Dude'].astype('category', categories=dude_order['Dude'], ordered=True)

# Sort the dataframe.
df = df.sort_values(by=['Dude', 'Total', 'Date'], ascending=[True, False, True])

结果输出:

         Date Dude  Dollar Total
5 2016-01-01 Joe 12 Yes
6 2016-01-01 Joe 3 No
4 2016-03-01 Joe 5 No
10 2016-05-01 Joe 4 No
8 2016-01-01 Sam 7 Yes
2 2016-01-01 Sam -2 No
9 2016-03-01 Sam 1 No
11 2016-05-01 Sam 8 No
0 2016-01-01 Bob 4 Yes
1 2016-01-01 Bob 1 No
3 2016-03-01 Bob 1 No
7 2016-05-01 Bob 2 No

关于python - Pandas :对行组而不是单个行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42915522/

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