Skip to main content
 首页 » 编程设计

python之Pandas 数据框 : shift/merge multiple rows sharing the same column values into one row

2025年05月04日8zlslch

抱歉可能与标题混淆。我会用下面的代码和图片更好地描述我的问题。

现在我有一个包含多列的数据框。前两列按它们排序,'Route' 和 'ID'(抱歉格式问题,此处所有行的 'Route' 值为 '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 

我想要的是

 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 

再次抱歉,格式困惑。让我试试简化版。

输入:

  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 

期望的输出:

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 

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

我在这里被难住了。新生成的列的名称无关紧要。

对于当前的数据框,每个“组”有三行,如代码所示。如果答案可以容纳每组任意数量的行,那就太好了。

感谢您的宝贵时间。

请您参考如下方法:

使用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() 

输出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