如何同时对熊猫数据框中的列进行排序[重复]

Posted

技术标签:

【中文标题】如何同时对熊猫数据框中的列进行排序[重复]【英文标题】:How to simultaneously sort columns in pandas dataframe [duplicate] 【发布时间】:2019-01-16 03:33:44 【问题描述】:

假设我想在 Pandas 中对一个数据框进行排序,我的数据框如下所示

   First Name    Last Name    Street        Address Type

0  Joe           Smith        123 Main St.  Property Address
1  Gregory       Stanton      124 Main St.  X Old Property Address
2  Phill         Allen        38 Maple St.  Alternate Address
3  Joe           Smith        PO Box 3165   Alternate Address
4  Xi            Dong         183 Main St.  Property Address
5  Phill         Allen        128 Main St.  Property Address

我想先按姓氏对数据框进行排序,使其看起来像这样:

   First Name    Last Name    Street        Address Type

0  Phill         Allen        38 Maple St.  Alternate Address
1  Phill         Allen        128 Main St.  Property Address
2  Xi            Dong         183 Main St.  Property Address
3  Joe           Smith        123 Main St.  Property Address
4  Joe           Smith        PO Box 3165   Alternate Address
5  Gregory       Stanton      124 Main St.  X Old Property Address

现在对于每个人,我希望财产地址在备用地址之前(如果该人同时拥有财产和备用地址),以便数据框如下所示:

   First Name    Last Name    Street        Address Type

0  Phill         Allen        128 Main St   Property Address
1  Phill         Allen        38 Maple St.  Alternate Address
2  Xi            Dong         183 Main St.  Property Address
3  Joe           Smith        123 Main St.  Property Address
4  Joe           Smith        PO Box 3165   Alternate Address
5  Gregory       Stanton      124 Main St.  X Old Property Address

请注意,Phill Allen 的条目已在上述数据框中切换,因为他的备用地址位于他的财产地址之前。 我的代码如下所示:

duplicates = df[df.duplicated(['Last Name'], keep=False)]
duplicates = duplicates.sort_values(['Last Name'], ascending = True)
duplicates = duplicates.sort_values(['Address Type'], ascending = True)

我已经尝试过使用

duplicates = df.sort_values(['last', 'Address Type'], ascending = True) 

这不起作用,因为地址类型可以是许多不同的东西,而不仅仅是主要/备用,而且当按升序/降序排序时,此代码不一定总是有效。

但它不会以正确的顺序切换属性地址和备用地址,因为 python 首先按姓氏对数据帧进行排序,然后根据地址类型对其进行排序。我正在寻找将首先按姓氏排序并基于这些姓氏,然后按地址类型排序的代码。任何帮助,将不胜感激。 谢谢!

【问题讨论】:

概括地说,您可以将 Address Type 转换为有序分类,然后按您的 2 列排序:df['Address Type'] = pd.Categorical(df['Address Type'],categories = ['Property Address','Alternate Address'],ordered=True),然后是 df.sort_values(['Last Name', 'Address Type'], inplace=True) 【参考方案1】:

您可以按多列排序。只需将两列都放在列表中即可。

duplicates = duplicates.sort_values(['Last Name', 'Address Type'], ascending = True)

【讨论】:

不幸的是,我已经尝试过这个解决方案,但它不起作用。 @SterlingBhollah 你试过duplicates.sort_values(['Last Name', 'Address Type'], ascending=[True, False]),因为“地址类型”不是升序的。 @SterlingBhollah 发生了什么? @RCA 我已经更新了我的问题以使其更清楚。我为混乱道歉。但是,地址类型并不总是二进制(属性/备用),有时它会是很多东西。例如,我将始终拥有物业地址,但有时我会有备用联系人或联系人:备用地址代替备用地址。我本质上是在寻找将财产地址放在首位的东西,然后在连续的行中寻找其他不是财产地址的东西。

以上是关于如何同时对熊猫数据框中的列进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

根据列名重新排序熊猫数据框中的列[重复]

根据列名重新排序熊猫数据框中的列[重复]

根据列名重新排序熊猫数据框中的列[重复]

如何根据列的值对熊猫数据框中的列进行分类?

在熊猫数据框中对重复的列 ID 进行分组

根据熊猫数据框中的列标签对数据进行分组