按 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
我有以下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