Pandas迭代索引并附加剩余的行

时间:2018-03-13 11:49:46

标签: python pandas

我有以下框架:

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 列。

2 个答案:

答案 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