循环分组行并比较组中的第一行-Python

nat*_*nay 4 python pandas

我有按来源和目的地对分组的数据。我想将组中的第一行与组中的其他行进行比较。如果一行满足某些条件,那么我想标记它。下面是我的数据快照:

Orig    Dest    Route   Vol     Per   VolPct
ORD     ICN     A       2,251   0.64    0.78
ORD     ICN     B       366     0.97    0.13
ORD     ICN     C       142     0.14    0.05
ORD     ICN     D       100     0.22    0.03
ORD     ICN     E       25      1.00    0.01
Run Code Online (Sandbox Code Playgroud)

如果一行的“VolPct”>=.1,则将其与第一行进行比较。所以在这个例子中,路线 B ​​将与路线 A 进行比较。如果路线 B ​​和路线 A 的“Per”之间的差异 >= .2,那么我想通过在一个“X”中放置一个“X”来标记路线 B新列。在此示例中,路由 B 将被标记。预期输出如下所示:

Orig    Dest    Route   Vol      Per    VolPct  Flag
ORD     ICN     A       2,251    0.64   0.78    
ORD     ICN     B       366      0.97   0.13       x
ORD     ICN     C       142      0.14   0.05    
ORD     ICN     D       100      0.22   0.03    
ORD     ICN     E       25       1.00   0.01    
Run Code Online (Sandbox Code Playgroud)

任何建议如何解决这个问题?我正在使用 Pandas 和 Python 3.6。谢谢你的帮助!

cs9*_*s95 5

IIUC,你可以用groupby+来做到这一点first。使用np.where用于确定值Flag

i = df.VolPct >= .1
j = (df.Per - df.groupby('Orig').Per.transform('first') >= .2)   

df['Flag'] = np.where(i & j, 'X', '')
df

  Orig Dest Route    Vol   Per  VolPct Flag
0  ORD  ICN     A  2,251  0.64    0.78     
1  ORD  ICN     B    366  0.97    0.13    X
2  ORD  ICN     C    142  0.14    0.05     
3  ORD  ICN     D    100  0.22    0.03     
4  ORD  ICN     E     25  1.00    0.01  
Run Code Online (Sandbox Code Playgroud)