如何按一列对熊猫数据框进行排序
- 2024-12-11 08:48:00
- admin 原创
- 136
问题描述:
我有一个像这样的数据框:
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)。从那里,我如何根据日历月份的顺序对该数据框进行排序?
解决方案 1:
用于sort_values
按特定列的值对 df 进行排序:
In [18]:
df.sort_values('2')
Out[18]:
0 1 2
4 85.6 January 1.0
3 95.5 February 2.0
7 104.8 March 3.0
0 354.7 April 4.0
8 283.5 May 5.0
6 238.7 June 6.0
5 152.0 July 7.0
1 55.4 August 8.0
11 212.7 September 9.0
10 249.6 October 10.0
9 278.8 November 11.0
2 176.5 December 12.0
如果要按两列排序,请将列标签列表传递给 ,sort_values
其中列标签按排序优先级排序。如果使用df.sort_values(['2', '0'])
,结果将按列2
再按列排序0
。当然,这对于此示例来说没有实际意义,因为 中的每个值df['2']
都是唯一的。
解决方案 2:
我尝试了上述解决方案,但没有得到结果,所以我找到了一个对我有用的其他解决方案。是按降序ascending=False
排列数据框,默认情况下是。我使用的是python 3.6.6和pandas 0.23.4版本。True
final_df = df.sort_values(by=['2'], ascending=False)
您可以在此处的pandas 文档中查看更多详细信息。
解决方案 3:
使用列名对我有用。
sorted_df = df.sort_values(by=['Column_name'], ascending=True)
解决方案 4:
熊猫sort_values
在做这项工作。
可以传递各种参数,例如ascending
(bool 或 bool 列表):
按升序或降序排序。指定多个排序顺序的列表。如果这是布尔列表,则必须与 by 的长度匹配。
由于默认值为升序,并且 OP 的目标是按升序排序,因此不需要指定该参数(请参阅下面最后的注释以了解解决降序的方法),因此可以使用以下方法之一:
就地执行操作,并保留相同的变量名。这需要传递
inplace=True
以下内容:
df.sort_values(by=['2'], inplace=True)
# or
df.sort_values(by = '2', inplace = True)
# or
df.sort_values('2', inplace = True)
如果不需要就地执行操作,则可以将更改(排序)分配给变量:
+ 与原始数据框同名,`df`如下所示
df = df.sort_values(by=['2'])
+ 使用不同的名称,`df_new`例如
df_new = df.sort_values(by=['2'])
上述所有操作将产生以下输出
0 1 2
4 85.6 January 1.0
3 95.5 February 2.0
7 104.8 March 3.0
0 354.7 April 4.0
8 283.5 May 5.0
6 238.7 June 6.0
5 152 July 7.0
1 55.4 August 8.0
11 212.7 September 9.0
10 249.6 October 10.0
9 278.8 November 11.0
2 176.5 December 12.0
最后,可以使用 重置索引pandas.DataFrame.reset_index
,得到以下内容
df.reset_index(drop = True, inplace = True)
# or
df = df.reset_index(drop = True)
[Out]:
0 1 2
0 85.6 January 1.0
1 95.5 February 2.0
2 104.8 March 3.0
3 354.7 April 4.0
4 283.5 May 5.0
5 238.7 June 6.0
6 152 July 7.0
7 55.4 August 8.0
8 212.7 September 9.0
9 249.6 October 10.0
10 278.8 November 11.0
11 176.5 December 12.0
按升序排序并重置索引的一行代码如下
df = df.sort_values(by=['2']).reset_index(drop = True)
[Out]:
0 1 2
0 85.6 January 1.0
1 95.5 February 2.0
2 104.8 March 3.0
3 354.7 April 4.0
4 283.5 May 5.0
5 238.7 June 6.0
6 152 July 7.0
7 55.4 August 8.0
8 212.7 September 9.0
9 249.6 October 10.0
10 278.8 November 11.0
11 176.5 December 12.0
笔记:
如果没有在现场进行操作,忘记上述步骤可能会导致一个人(作为该用户)无法获得预期的结果。
对于如何使用 ,人们有着强烈的意见
inplace
。为此,人们可能需要阅读这篇文章。假设该列
2
不是字符串。如果是,则必须对其进行转换:
+ 使用`pandas.to_numeric`
df['2'] = pd.to_numeric(df['2'])
+ 使用`pandas.Series.astype`
df['2'] = df['2'].astype(float)
如果要按降序排列,则需要
ascending=False
传递
df = df.sort_values(by=['2'], ascending=False)
# or
df.sort_values(by = '2', ascending=False, inplace=True)
[Out]:
0 1 2
2 176.5 December 12.0
9 278.8 November 11.0
10 249.6 October 10.0
11 212.7 September 9.0
1 55.4 August 8.0
5 152 July 7.0
6 238.7 June 6.0
8 283.5 May 5.0
0 354.7 April 4.0
7 104.8 March 3.0
3 95.5 February 2.0
4 85.6 January 1.0
解决方案 5:
正如另一个解决方案:
您不需要创建第二列,而是可以对字符串数据(月份名称)进行分类,然后按如下方式排序:
df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)
它将按照month name
您在创建Categorical
对象时指定的顺序为您提供数据。
解决方案 6:
只需在数据上添加一些操作即可。假设我们有一个数据框df
,我们可以进行一些操作来获得所需的输出
ID cost tax label
1 216590 1600 test
2 523213 1800 test
3 250 1500 experiment
(df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)
将sorted
输出标签作为dataframe
index label
0 test 2
1 experiment 1
解决方案 7:
这对我有用
df.sort_values(by='Column_name', inplace=True, ascending=False)
解决方案 8:
您可能需要在排序后重置索引:
df = df.sort_values('2')
df = df.reset_index(drop=True)
解决方案 9:
这是根据 pandas 文档的 sort_values 模板。
DataFrame.sort_values(by, axis=0,
ascending=True,
inplace=False,
kind='quicksort',
na_position='last',
ignore_index=False, key=None)[source]
在这种情况下,它会是这样的。
df.sort_values(by=['2'])
API 参考pandas.DataFrame.sort_values
解决方案 10:
补充一些见解
df=raw_df['2'].sort_values() # will sort only one column (i.e 2)
但 ,
df =raw_df.sort_values(by=["2"] , ascending = False) # this will sort the whole df in decending order on the basis of the column "2"
解决方案 11:
如果您想动态地对列进行排序但不按字母顺序排序。并且不想使用 pd.sort_values()。您可以尝试以下解决方案。
问题:按以下序列对“col1”列进行排序 [‘A’, ‘C’, ‘D’, ‘B’]
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
解决方案 12:
使用键排序
从 pandas 1.1.0 开始,我们可以传递一个key=
参数,该参数接受一个函数作为排序键,就像Python 中key
内置函数中的参数一样。但是,与传递给键的函数不同,此函数必须是矢量化的,这意味着它必须输出一个 Series/DataFrame 来用于对输入进行排序。sorted()
`sorted`
对于 OP 中的示例,我们可以直接将排序键'2'
应用于列,而不是创建列以按列排序。由于作为参数传递的列在内部进行操作,因此我们可以创建一个月份名称到数字的映射器字典,并传递一个将该字典映射到列的 lambda 。'1'
`'1'by=
.sort_values()`'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))
如您所见,这让人想起sorted()
原始 Python 中的以下调用:
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'))
这让人想起sorted()
原始 Python 中的以下调用:
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]
上面列出的三种方法均执行以下转换:
解决方案 13:
这个对我有用:
df=df.sort_values(by=[2])
然而:
df=df.sort_values(by=['2'])
不工作。
解决方案 14:
我希望这些会有所帮助:
df.sort_values(by=['col1','col2','col3'],ascending = False)
如果您有Na
价值观,那么请使用这些:
df.sort_values(by=['col1','col2','col3'],ascending = False, na_position = first)
解决方案 15:
示例:假设您有一列,其值为 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)