2016-05-31 3 views
0

У меня есть Dataframe (DF), который выглядит следующим образом:Turn каждые 2 ряда Dataframe в 1 ряд х 2 колонки

date  ID Team P F T TO 
0 20160101 537 Bobcats 5 10 0 3 
1 20160101 538 Spartans8 10 1 4 
2 20160101 539 Tigers 7 8 2 3 
3 20160101 540 Vikings 10 5 0 1 
4 20160101 541 Smurfs 5 3 0 2 
5 20160101 542 Winners 6 9 1 0 

я пытаюсь конденсироваться каждые 2 строки в 1 и по-прежнему держать все из поля, так что новый dataframe (new_df) выглядит следующим образом:

date  ID1 Team1 P1 F1 T1 TO1 ID2 Team2 P2 F2 T2 TO2 
0 20160101 537 Bobcats 5 10 0 3 538 Spartans8 10 1 4 
2 20160101 539 Tigers 7 8 2 3 540 Vikings 10 5 0 1 
4 20160101 541 Smurfs 5 3 0 2 542 Winners 6 9 1 0 

что является наиболее эффективным способом сделать это с помощью Python?

ответ

1

Один из способов сделать это - просто выяснить противника для каждой команды, а затем объединить таблицу в себя. Я предполагаю на основе вашего примера, что ID 2n-1 играл против ID 2n. Если это неверно, отрегулируйте это соответственно (например, вы можете вычислить противника на основе индекса).

D['ID_opp']=D['ID'].apply(lambda x:x-1 if x%2==0 else np.nan) 
D 


    date ID Team P F T TO ID_opp 
0 20160101 537 Bobcats 5 10 0 3 NaN 
1 20160101 538 Spartans 8 10 1 4 537 
2 20160101 539 Tigers 7 8 2 3 NaN 
3 20160101 540 Vikings 10 5 0 1 539 
4 20160101 541 Smurfs 5 3 0 2 NaN 
5 20160101 542 Winners 6 9 1 0 541 

, а затем сделать Слить

D.merge(D,left_on='ID',right_on='ID_opp',suffixes=('1','2')).drop(['ID_opp1','ID_opp2','date2'],axis=1) 

     date1 ID1 Team1 P1 F1 T1 TO1 ID2 Team2 P2 F2 T2 TO2 
0 20160101 537 Bobcats 5 10 0 3 538 Spartans 8 10 1 4 
1 20160101 539 Tigers 7 8 2 3 540 Vikings 10 5 0 1 
2 20160101 541 Smurfs 5 3 0 2 542 Winners 6 9 1 0 
+0

Если «следующая строка вниз» на самом деле способ выяснить противника, а затем что-то, как это будет работать: 'D [«ID_opp»] = [ D ['ID']. Iloc [i-1], если i% 2 == 1 else np.nan для i в диапазоне (D.shape [0])] ' –