2016-11-06 192 views
1

我正在研究一些機器學習任務,我想將每行從「編號對象」更改爲「按某些attrs對象排序」。例如,我有兩支隊伍由他們的統計數據(dN_%stat%和rN_%stat%)代表的5個英雄,我想要的是按照編號3,4,0的統計數字對每個隊伍中的英雄進行排序, 2所以第一個是最強的,依此類推。按行排序熊貓分組列表

這裏是我當前的代碼,但它是非常緩慢的,所以我想用本土大熊貓的對象和操作:

def sort_heroes(df): 
    for match_id in df.index: 
     for team in ['r', 'd']: 
      heroes = [] 
      for n in range(1,6): 
       heroes.append(
        [df.ix[match_id, '%s%s_%s' % (team, n, stat)] 
        for stat in stats]) 

      heroes.sort(key=lambda x: (x[3], x[4], x[0], x[2])) 
      for n in range(1,6): 
       for i, stat in enumerate(stats): 
        df.ix[match_id, '%s%s_%s' % 
          (team, n, stat)] = heroes[n - 1][i] 

簡短的例子有不完整的,但有用的數據表示:

match_id r1_xp r1_gold r2_xp r2_gold r3_xp r3_gold d1_xp d1_gold d2_xp d2_gold 
1   10  20  100 10  5000 300  0  0  15  5 
2   1  1  1000 80  100 13  200 87  311 67 

我想要的是按帶有前綴(rN_和dN_)的組排序這些列,然後通過xp

match_id r1_xp r1_gold r2_xp r2_gold r3_xp r3_gold d1_xp d1_gold d2_xp d2_gold 
1   5000 300  10  20  100 20  15  5  0  0 
2   1000 80  100 13  1  1  200 87  311 67 
+0

你能發佈的數據框你如何構造一個簡單的例子? – sobek

+0

數據框中的行是什麼? – sobek

+0

每一行代表關於比賽的信息,其中的英雄隊伍%NUM %%取%部分 – Sindbag

回答

3

您可以使用:

df.set_index('match_id', inplace=True) 
#create MultiIndex with 3 levels 
arr = df.columns.str.extract('([rd])(\d*)_(.*)', expand=True).T.values 
df.columns = pd.MultiIndex.from_arrays(arr) 
#reshape df, sorting 
df = df.stack([0,1]).reset_index().sort_values(['match_id','level_1','gold','xp'], 
               ascending=[True,False,False,False]) 
print (df) 
    match_id level_1 level_2 gold  xp 
4   1  r  3 300.0 5000.0 
2   1  r  1 20.0 10.0 
3   1  r  2 10.0 100.0 
1   1  d  2 5.0 15.0 
0   1  d  1 0.0  0.0 
8   2  r  2 80.0 1000.0 
9   2  r  3 13.0 100.0 
7   2  r  1 1.0  1.0 
5   2  d  1 87.0 200.0 
6   2  d  2 67.0 311.0 

#asign new values to level 2 
df.level_2 = df.groupby(['match_id','level_1']).cumcount().add(1).astype(str) 
#get original shape 
df = df.set_index(['match_id','level_1','level_2']).stack().unstack([1,2,3]).astype(int) 
df = df.sort_index(level=[0,1,2], ascending=[False, True, False], axis=1) 
#Multiindex in columns to column names 
df.columns = ['{}{}_{}'.format(x[0], x[1], x[2]) for x in df.columns] 
df.reset_index(inplace=True) 
print (df) 
    match_id r1_xp r1_gold r2_xp r2_gold r3_xp r3_gold d1_xp d1_gold \ 
0   1 5000  300  10  20 100  10  15  5 
1   2 1000  80 100  13  1  1 200  87 

    d2_xp d2_gold 
0  0  0 
1 311  67