Pandas Dataframe:将共享相同列值的多行移位/合并为一行

Bow*_*Liu 1 python pandas

很抱歉与标题有任何混淆.我将使用以下代码和图片更好地描述我的问题.

现在我有一个包含多列的数据框.排序前两列,"路线"和"ID"(抱歉格式化,这里的所有行都有'路线'值'100'和'ID'从1到3.

df1.head(9)
  Route ID  Year    Vol Truck_Vol   Truck_%
0   100 1   2017.0  7016    635.0   9.1
1   100 1   2014.0  6835    NaN NaN
2   100 1   2011.0  5959    352.0   5.9
3   100 2   2018.0  15828   NaN NaN
4   100 2   2015.0  13114   2964.0  22.6
5   100 2   2009.0  11844   1280.0  10.8
6   100 3   2016.0  15434   NaN NaN
7   100 3   2013.0  18699   2015.0  10.8
8   100 3   2010.0  15903   NaN NaN
Run Code Online (Sandbox Code Playgroud)

我想要的是

 Route  ID  Year    Vol1    Truck_Vol1  Truck_%1    Year2   Vol2    Truck_Vol2  Truck_%2    Year3   Vol3    Truck_Vol3  Truck_%3
0   100 1   2017    7016    635.0   9.1 2014    6835    NaN NaN 2011    5959    352.0   5.9
1   100 2   2018    15828   NaN NaN 2015    13114   2964.0  22.6    2009    11844   1280.0  10.8
2   100 3   2016    15434   NaN NaN 2013    18699   2015.0  10.8    2010    15903   NaN NaN
Run Code Online (Sandbox Code Playgroud)

再次,抱歉凌乱的格式.让我试试一下简化版.

输入:

  Route ID  Year    Vol T_%
0   100 1   2017    100 1.0
1   100 1   2014    200 NaN
2   100 1   2011    300 2.0
3   100 2   2018    400 NaN
4   100 2   2015    500 3.0
5   100 2   2009    600 4.0
Run Code Online (Sandbox Code Playgroud)

期望的输出:

Route   ID  Year    Vol T_% Year.1  Vol.1   T_%.1   Year.2  Vol.2   T_%.2
0   100 1   2017    100 1.0 2014    200     NaN     2011    300      2
1   100 2   2018    400 NaN 2015    500     3.0     2009    600      4
Run Code Online (Sandbox Code Playgroud)

所以基本上只需移动图片中显示的单元格

输入

产量

我在这里难过.新生成的列的名称无关紧要.

对于当前的数据帧,我在每个"组"中有三行,如代码中所示.如果答案可以容纳每组的任意数量的行,那将是很好的.

谢谢你的时间.

ALo*_*llz 5

groupby+ cumcount+ set_index+unstack

df1 = df.assign(cid = df.groupby(['Route', 'ID']).cumcount()).set_index(['Route', 'ID', 'cid']).unstack(-1).sort_index(1,1)
df1.columns = [f'{x}{y}' for x,y in df1.columns]
df1 = df1.reset_index()
Run Code Online (Sandbox Code Playgroud)

输出df1:

   Route  ID  T_%0  Vol0  Year0  T_%1  Vol1  Year1  T_%2  Vol2  Year2
0    100   1   1.0   100   2017   NaN   200   2014   2.0   300   2011
1    100   2   NaN   400   2018   3.0   500   2015   4.0   600   2009
Run Code Online (Sandbox Code Playgroud)