通过同时降序排列行和列来对数据框进行排序

时间:2019-12-02 22:12:02

标签: python pandas sorting dataframe indexing

  

当前有一个按系列划分的国家/地区的数据框,其值范围为0-25

     

我想对df进行排序,以使最大值出现在左上方(第一个),而最小值出现在右下方(最后一个)。

FROM

        A   B   C   D  ...

USA     4   0   10  16
CHN     2   3   13  22
UK      2   1   8   14
...

TO

      D   C   A   B   ...

CHN   22  13  2   3
USA   16  10  4   0
UK    14  8   2   1

...

在这种情况下,具有最高值的列现在排在第一位,索引也是如此。

  

我已经考虑过重新编制索引,但这会丢失“国家”索引。

    D   C   A   B   ...

0   22  13  2   3
1   16  10  4   0
2   14  8   2   1
...
  
    

我考虑过要创建一个新的列和行,该列和行具有相应列/行的均值或总和,但这是最有效的方法吗?

         
      

在我有了新的行/列之后,如何对DF排序?

    
  

有没有一种方法可以使用...

df_mv.reindex(df_mv.mean(or sum)().sort_values(ascending = False).index, axis=1)

...这将允许我保留国家/地区索引,并对其进行相应的排序?

感谢所有建议或帮助。

  

编辑

     
    

预期结果将列和行从最大到最小进行组织。

         
      

关于预期输出中A和B列的第一行,它们分别假定为2、3。这是因为预期结果将总和和均值解释为A列大于B列(即使可以将总和或均值视为行/列的“值”)。

    
  

通过说较高的数字将在左上角,而较低的数字将在右下角,我只是将其表示为所得df的总体趋势。但是,预期的重点是整个列和行。对于造成的困扰,我深表歉意。

4 个答案:

答案 0 :(得分:4)

您可以使用:

rows_index=df.max(axis=1).sort_values(ascending=False).index
col_index=df.max().sort_values(ascending=False).index
new_df=df.loc[rows_index,col_index]
print(new_df)

      D   C  A  B
CHN  22  13  2  3
USA  16  10  4  0
UK   14   8  2  1

答案 1 :(得分:3)

使用.Ttranspose行到列,反之亦然:

df = df.sort_values(df.max().idxmax(), ascending=False)
df = df.T
df = df.sort_values(df.columns[0], ascending=False).T

结果:

>>> df
      D   C  B  A
CHN  22  13  3  2
USA  16  10  0  4
UK   14   8  1  2

答案 2 :(得分:1)

这是另一种方式,这次不进行转置,而是使用axis=1作为参数:

df = df.sort_values(df.max().idxmax(), ascending=False)
df = df.sort_values(df.index[0], axis=1, ascending=False)

答案 3 :(得分:1)

使用>>> b"Ana\xefs's".decode('windows-1252') "Anaïs's" >>> b"Ana\xefs's".decode('iso-8859-1') "Anaïs's" >>> b"Ana\xefs's".decode('iso-8859-2') "Anaďs's" >>> b"Ana\xefs's".decode('iso-8859-4') "Anaīs's" >>> b"Ana\xefs's".decode('iso-8859-5') "Anaяs's"

      <div class="input-group pl-2">
        <input type="text" class="form-control" placeholder="Enter a string...">         
          <span class="input-group-btn pr-2">
            <button class="btn btn-success" type="submit">
              <span></span>Search
            </button>
          </span>
      </div>

输出:

AWSMobileClient.default().federatedSignIn(providerName: IdentityProvider.facebook.rawValue, token: (result?.token!.tokenString)!, completionHandler: { (userState, error) in
if let error = error{
    print("Initialize Error: ", error.localizedDescription)
}else{
    print("User State: ", userState!)//User State:  signedIn
    switch (userState) {
    case .signedIn?:
        DispatchQueue.main.async {
            self.getAWSToken()
        }
    default:
        print("Sign In needs info which is not et supported.")
    }
}
})  
func getAWSToken(){
    AWSMobileClient.default().getTokens { (result, error) in
        if error == nil{
            print("JWT Token: ", (result?.idToken?.tokenString!)!)
            print("Expire : ", (result?.expiration!)!)
            AppData.sharedInstance.JWT_Token = (result?.idToken?.tokenString!)! as String
            AppData.sharedInstance.Refresh_Token = (result?.refreshToken?.tokenString!)! as String
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd H:mm:ss"
            let dtStr = dateFormatter.string(from: (result?.expiration!)!)
            let expireDate =  Utility.UTCToLocal(date: dtStr)
            AppData.sharedInstance.JWT_Token_Expire_Date = expireDate
            UserDefaults.standard.set(AppData.sharedInstance.JWT_Token_Expire_Date, forKey: Utility.KEY_JWT_TOKEN_EXPIRE_DATE)
            UserDefaults.standard.set(AppData.sharedInstance.JWT_Token, forKey: Utility.KEY_JWT_Token)
            UserDefaults.standard.set(AppData.sharedInstance.Refresh_Token, forKey: Utility.KEY_Refresh_Token)
            DispatchQueue.main.async {
                self.getUserInfo()
                RSApiManager.shared.postDeviceToken(dToken: Utility.MY_TOKEN)
            }
        }else{
            print("Error: ", error.debugDescription)
        }
    }
}