如何同时对Pandas DataFrame中的列进行排序

时间:2018-08-08 19:05:54

标签: python pandas sorting for-loop columnsorting

假设我想在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首先按姓氏对数据帧进行排序,然后根据地址类型对数据帧求助。我正在寻找的代码将首先按姓氏排序,然后根据这些姓氏排序,然后按地址类型排序。任何帮助,将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

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

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