2016-05-31 76 views
0

我有一个数据帧(DF),看起来像这样:把每2行数据帧到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,仍然保持所有的使新的数据帧(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] if i%2 == 1 else np.nan for i in range(D.shape [0])]' –