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

标签 python sorting pandas

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

相关文章:

python - 使用命令列表执行文件中列表的元素

python - 当子进程输出满足条件时杀死子进程?

java - 基于 arraylist 的排序索引的 Hashmap 排序

javascript - 按 2 列对多维数组进行排序 - JavaScript

python - 在 pandas DataFrame 中每组选择 1 个 True,1 个 False

python - 将多个函数应用于多个 groupby 列

python : mysql : Return 0 when no rows found

python - 从文本文件中提取图形到 python 图形

c - Turbo C 在执行 C 冒泡排序程序时挂起

python - 使用不同格式(csv、json、avro)将数据加载到 pd.DataFrame 的最快方法