按 pandas 分组以获取从源到最终目的地的路径

Group by pandas to get path from source to end destination

我有以下table

Path ID Lane ID Customer Source Destination Mode
1 1 Mumbai Chicago Berlin Ship
1 2 Mumbai Berlin Mumbai Air
2 1 Mumbai Chicago Berlin Air
2 2 Mumbai Berlin Dubai Air
2 3 Mumbai Dubai Mumbai Ship

我想要以下table

Path ID Source Site2 Site3 Destination Lane1 Mode Lane2 Mode Lane3 Mode
1 Chicago Berlin Mumbai Ship Air
2 Chicago Berlin Dubai Mumbai Air Air Ship

我该如何获得这个 table?我觉得 groupby 显然是必需的,但那之后呢?不确定如何从那里开始。数据集真的很大,所以它也需要高效。任何指针都会有所帮助:)

看起来您实际上是在旋转 Lane Id 并使用 Path Id 建立索引。这应该可以帮助您完成大部分工作。

df.pivot(index="Path ID", columns="Lane ID")

drop个不相关的列。然后正如@LiamRoberts 指出的那样,pivot 将使我们处于正确的状态。然后用 stack + groupby + last 修复“目标”列。最后,修正列名。

s = df.drop(columns='Customer').pivot(index=['Path ID'], columns=['Lane ID'])
s['Dest'] = s['Destination'].stack().groupby(level=0).last()
s = s.drop(columns='Destination').reset_index()
s.columns = [f'{c1}{c2}' for c1, c2 in s.columns]
s = (s.rename(columns={'Source1':'Source', 'Source2':'Site2', 
                       'Source3':'Site3', 'Dest':'Destination',
                      'Mode1':'Lane1 Mode', 'Mode2':'Lane2 Mode', 
                       'Mode3':'Lane3 Mode'})[['Path ID','Source','Site2','Site3','Destination',
                                               'Lane1 Mode','Lane2 Mode','Lane3 Mode']])

输出:

   Path ID   Source   Site2  Site3 Destination Lane1 Mode Lane2 Mode    Lane3 Mode  
0        1  Chicago  Berlin    NaN      Mumbai       Ship        Air           NaN  
1        2  Chicago  Berlin  Dubai      Mumbai        Air        Air          Ship