2016-09-20 22 views
0

我有我想通過「test_type」Python的大熊貓據幀sort_values不起作用

test_type   tps   mtt  mem  cpu  90th 
0 sso_1000 205.263559 4139.031090 24.175933 34.817701 4897.4766 
1 sso_1500 201.127133 5740.741266 24.599400 34.634209 6864.9820 
2 sso_2000 203.204082 6610.437558 24.466267 34.831947 8005.9054 
3 sso_500 189.566836 2431.867002 23.559557 35.787484 2869.7670 

我的代碼進行排序加載數據框和排序是,下面的熊貓數據幀打印的第一行打印上面的數據框。

 df = pd.read_csv(file) #reads from a csv file 
     print df 
     df = df.sort_values(by=['test_type'], ascending=True) 
     print '\nAfter sort...' 
     print df 

在對數據幀內容進行排序和打印之後,數據幀仍如下所示。

程序輸出:

After sort... 
    test_type   tps   mtt  mem  cpu  90th 
0 sso_1000 205.263559 4139.031090 24.175933 34.817701 4897.4766 
1 sso_1500 201.127133 5740.741266 24.599400 34.634209 6864.9820 
2 sso_2000 203.204082 6610.437558 24.466267 34.831947 8005.9054 
3 sso_500 189.566836 2431.867002 23.559557 35.787484 2869.7670 

我期望行3(測試類型:sso_500行)是在頂部排序後。有人能幫我弄清楚爲什麼它不能正常工作嗎?

+4

看起來像是用'test_type',這是一個字符串,它的字典順序排序。我認爲你可能需要將'_'和zfill分隔到4列中的「數字」部分。 –

回答

5

預言中,你要做的是按sso_之後的數值進行排序。你可以這樣做如下:

import numpy as np 

df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values) 

  1. _拆分字符串

  2. 將這個字符的數值

  3. 後有什麼查找分類指數根據數值

  4. 重新排序,根據這些指標

In [15]: df = pd.DataFrame({'test_type': ['sso_1000', 'sso_500']}) 

In [16]: df.sort_values(by=['test_type'], ascending=True) 
Out[16]: 
    test_type 
0 sso_1000 
1 sso_500 

In [17]: df.ix[np.argsort(df.test_type.str.split('_').str[-1].astype(int).values)] 
Out[17]: 
    test_type 
1 sso_500 
0 sso_1000 
+0

我剛測試過這個,你說得對。我最終做的是重新排列我的另一個程序(csv生成器)中的字符串,使其成爲500_sso而不是sso_500。它似乎解決了我的問題,我只需要記住以這種方式生成我的測試類型字符串。 – jeffsia

+0

'500_sso'仍應該在'1500_sso'之後排序。 –

3

或者數據框,你也可以從test_type提取號碼,對它們進行排序。然後根據這些指數重新索引DF

df.reindex(df['test_type'].str.extract('(\d+)', expand=False) \ 
          .astype(int).sort_values().index).reset_index(drop=True) 

Image