我正试图根据ID字段来旋转(或取消堆叠?)数据框,如下所示:
ID Col1 Col2
1 a aa
2 b bb
3 c cc
3 d dd
对此:
ID Col1 Col2 Col1 Col2
1 a aa
2 b bb
3 c cc d dd
所以我正在尝试:
df2 = df.pivot(None, 'ID')
这给了我错误:
builtins.IndexError:索引1796516957超出了轴0的范围 大小1796298784
我做错了什么?
答案 0 :(得分:1)
对MultiIndex
列使用cumcount
+ set_index
+ unstack
:
a = df.groupby('ID').cumcount().astype(str)
df = df.set_index(['ID', a]).unstack(fill_value='').sort_index(level=1, axis=1)
替代apply
:
c = ['Col1','Col2']
df = (df.groupby('ID')[c]
.apply(lambda x: pd.DataFrame(x.values, columns=c))
.unstack(fill_value='')
.sort_index(level=1, axis=1))
print (df)
Col1 Col2 Col1 Col2
0 0 1 1
ID
1 a aa
2 b bb
3 c cc d dd
对于重复列名称,请使用droplevel
:
df.columns = df.columns.droplevel(1)
print (df)
Col1 Col2 Col1 Col2
ID
1 a aa
2 b bb
3 c cc d dd
对于唯一列名称,请使用join
:
df.columns = df.columns.map('_'.join)
print (df)
Col1_0 Col2_0 Col1_1 Col2_1
ID
1 a aa
2 b bb
3 c cc d dd