如何按一列对熊猫数据框进行排序

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 ...

问题描述:

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

        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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用