如何按照一列对pandas dataframe进行排序

645

我有一个数据框,像这样:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

如您所见,月份并没有按照日历的顺序排列。因此我创建了第二列来获取每个月对应的月份数字(1-12)。从那里开始,我该如何根据日历月份的顺序对这个数据框进行排序?

14个回答

6

如果您想要动态地对列进行排序但不是按字母顺序, 并且不想使用 pd.sort_values()。 您可以尝试以下解决方案。

问题:按照 ['A','C','D','B'] 的顺序对列 "col1" 进行排序。

import pandas as pd
import numpy as np

## Sample DataFrame ##
df = pd.DataFrame({'col1': ['A', 'B', 'D', 'C', 'A']})

>>> df
   col1
0    A
1    B
2    D
3    C
4    A
## Solution ##

conditions = []
values = []

for i,j in enumerate(['A','C','D','B']):
    conditions.append((df['col1'] == j))
    values.append(i)

df['col1_Num'] = np.select(conditions, values)

df.sort_values(by='col1_Num',inplace = True)

>>> df

    col1  col1_Num
0    A         0
4    A         0
3    C         1
2    D         2
1    B         3

1
这个对我起作用:

df=df.sort_values(by=[2])

鉴于:

df=df.sort_values(by=['2']) 

不起作用。


1

使用键进行排序

自从pandas 1.1.0版本以后,我们可以传递一个key=参数,该参数接受一个函数作为排序键,就像Python内置的sorted()函数中的key参数一样。然而,与传递给sorted函数的键函数不同的是,这个函数必须是矢量化的,也就是说它必须输出一个Series/DataFrame来用于排序输入。

对于OP中的示例,我们可以直接对列'1'应用排序键,而不是创建列'2'来按列'1'排序。因为作为by=参数传递的列在.sort_values()内部进行操作,我们可以创建一个月份名称到数字的映射字典,并传递一个lambda函数将这个字典映射到列'1'

import calendar   # <--- the builtin calendar module
month_to_number_mapper = {m:i for i,m in enumerate(calendar.month_name)}
df1 = df.sort_values(by='1', key=lambda col: col.map(month_to_number_mapper))

正如你所看到的,这让人想起了在纯Python中使用sorted()函数的调用。
li = sorted(df.values, key=lambda row: month_to_number_mapper[row[1]])

对于OP中的示例,由于列'1'是一个月份名称的列,我们可以将其视为日期时间列来对数据框进行排序。为了做到这一点,我们可以将pandas的to_datetime函数作为关键字传递。
df1 = df.sort_values(by='1', key=lambda col: pd.to_datetime(col, format='%B'))

这让人想起了在纯Python中调用sorted()的情景。
from datetime import datetime
li = sorted(df.values, key=lambda row: datetime.strptime(row[1], '%B'))

按索引排序
Pandas的.loc[]根据传递给它的值重新排列行。因此,另一种排序的方法是使用任何排序键对列'1'进行排序,然后将排序后的对象的索引传递给loc[]。
sorted_index = pd.to_datetime(df['1'], format='%B').sort_values().index
df1 = df.loc[sorted_index]

所有上述列出的三种方式都执行以下转换:

result


-1

例子: 假设您有一个包含值1和0的列,并且您想要分离并仅使用一个值,则:

// furniture is one of the columns in the csv file.
 

allrooms = data.groupby('furniture')['furniture'].agg('count')
allrooms


myrooms1 = pan.DataFrame(allrooms, columns = ['furniture'], index = [1])

myrooms2 = pan.DataFrame(allrooms, columns = ['furniture'], index = [0])

print(myrooms1);print(myrooms2)

1
图片不是展示代码的好方法。请将其作为文本发布,这样对于每个人来说都更容易。 - DavidW
尝试通过发布代码本身使其易于调试。 http://idownvotedbecau.se/imageofcode - A.M. Ducu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接