我有以下框架:
df = pd.DataFrame(data={'id':[1,2,3],'x':[3,2,1]}).set_index('id')
print df
x
id
1 3
2 2
3 1
我需要迭代行,以便对于每个id,我们追加剩余的行,例如输出应该是:
x
id
1 3
2
1
2 2
1
3 1
理想 O(n)解决方案,推广到 m 列。
答案 0 :(得分:2)
使用列表理解,按iloc
的位置切换list of DataFrame
,然后concat
一起加入,最后删除MultiIndex
的第二级:
comp = [df.iloc[i:] for i in range(len(df.index))]
df = pd.concat(comp, keys=df.index).reset_index(level=1, drop=True)
print (df)
x
id
1 3
1 2
1 1
2 2
2 1
3 1
如果需要level
,则可以为MultiIndex name
集添加rename_axis
:
df = pd.concat(comp, keys=df.index).rename_axis(('a','b'))
print (df)
x
a b
1 1 3
2 2
3 1
2 2 2
3 1
3 3 1
编辑:
第一级不显示重复值,但不会丢失任何值:
#change default option multi_sparse=True
with pd.option_context('display.multi_sparse', False):
print (df)
x
a b
1 1 3
1 2 2
1 3 1
2 2 2
2 3 1
3 3 1
答案 1 :(得分:1)
像
这样的东西df.groupby(level=0).x.apply(lambda y : (np.arange(y)+1)[::-1]).apply(pd.Series).stack()
Out[320]:
id
1 0 3.0
1 2.0
2 1.0
2 0 2.0
1 1.0
3 0 1.0
dtype: float64