2016-11-06 2 views
1

일부 컴퓨터 학습 작업을하고 있는데, "번호가 매겨진 객체"에서 "일부 attrs 객체별로 정렬"로 각 줄을 변경하고 싶습니다.팬더를 줄 단위로 그룹화합니다.

예를 들어 두 팀의 영웅이 각각 통계 (dN_ % stat % 및 rN_ % stat %)로 표시되며, 각 팀의 영웅을 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

당신이 당신의 dataframe가 어떻게 구성되어 있는지에 대한 간단한 예를 게시 할 수 있을까요? – sobek

+0

데이터 프레임의 행은 무엇입니까? – sobek

+0

각 행은 일치에 대한 정보를 나타냅니다. 영웅 % team %% 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