无法重塑(枢轴)大熊猫DF

时间:2019-12-20 14:25:53

标签: python pandas pivot reshape

所以我有这个DF:

In [130]: dfAbr
Out[130]: 
           ip ospfArea router_name
0     1.1.1.1  0.0.0.2   Router1-1
1     1.1.1.2  0.0.0.2   Router1-2
140   5.5.5.1  0.0.0.5   Router5-1
141   5.5.5.2  0.0.0.5   Router5-2

我想将其重塑为2行数据框,例如:

enter image description here

我一直在使用stack/unstackpivot函数,但是走得太远了。

例如,dfAbr1 = pd.DataFrame(dfAbr.set_index('ospfArea').stack()).reset_index()重命名列名,将产生以下内容:

In [151]: dfAbr1
Out[151]: 
  ospfArea       level1     level2
0  0.0.0.2           ip    1.1.1.1
1  0.0.0.2  router_name  Router1-1
2  0.0.0.2           ip    1.1.1.2
3  0.0.0.2  router_name  Router1-2
4  0.0.0.5           ip    5.5.5.1
5  0.0.0.5  router_name  Router5-1
6  0.0.0.5           ip    5.5.5.2
7  0.0.0.5  router_name  Router5-2

从那里,我想pivot,像这样:dfAbr1.pivot(index='ospfArea', columns='level1',values='level2'),但是当我得到Index contains duplicate entries, cannot reshape时就不会这么做。我相信这是因为在level1下,我有重复的值...

还有其他方法吗?

谢谢!

2 个答案:

答案 0 :(得分:7)

DataFrame.set_index创建MultiIndex,用GroupBy.cumcount创建计数器列,用DataFrame.unstack重整形状,并用{{1}将Multiindex平坦化map }:

format

答案 1 :(得分:1)

具有枢轴的解决方案,另请参见this question

new_df = (df.assign(col=df.groupby('ospfArea').cumcount())
   .pivot(index='ospfArea', columns='col')
)

new_df.columns = [f'{x[0]}{x[1]+1}' for x in new_df.columns]

输出:

              ip1      ip2 router_name1 router_name2
ospfArea                                            
0.0.0.2   1.1.1.1  1.1.1.2    Router1-1    Router1-2
0.0.0.5   5.5.5.1  5.5.5.2    Router5-1    Router5-2