我正在尝试找到一种基于列对对数据进行排序的方法。我下面的当前代码非常接近,但我最终想将 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/