无法重塑(枢轴)pandas DF
Can't reshape (pivot) pandas DF
所以我有这个 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 行数据框,例如:
我一直在玩 stack/unstack
和 pivot
函数,但没能玩到那么远。
例如,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
下我有重复的值...
还有其他方法吗?
谢谢!
通过 DataFrame.set_index
with counter column by GroupBy.cumcount
, reshape by DataFrame.unstack
创建 MultiIndex
并通过 map
使用 format
压平 Multiindex
:
df = df.set_index(['ospfArea', df.groupby('ospfArea').cumcount().add(1)]).unstack()
df.columns = df.columns.map('{0[0]}{0[1]}'.format)
print (df)
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
带枢轴的解法,另见
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
所以我有这个 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 行数据框,例如:
我一直在玩 stack/unstack
和 pivot
函数,但没能玩到那么远。
例如,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
下我有重复的值...
还有其他方法吗?
谢谢!
通过 DataFrame.set_index
with counter column by GroupBy.cumcount
, reshape by DataFrame.unstack
创建 MultiIndex
并通过 map
使用 format
压平 Multiindex
:
df = df.set_index(['ospfArea', df.groupby('ospfArea').cumcount().add(1)]).unstack()
df.columns = df.columns.map('{0[0]}{0[1]}'.format)
print (df)
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
带枢轴的解法,另见
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