所以我有以下熊猫数据框:
import pandas as pd
sample_df = pd.DataFrame({'note': ['D','C','D','C'], 'time': [1,1,4,6], 'val': [6,4,7,9]})
给出结果
note time val
0 D 1 6
1 C 1 4
2 D 4 7
3 C 6 9
我想要的是
note index time val
C 1 1 4
3 6 9
D 0 1 6
2 4 7
我尝试了sample_df.set_index('note',append=True)
,但没有用。
答案 0 :(得分:2)
在第一级将DataFrame.swaplevel
与DataFrame.sort_index
相加:
df = sample_df.set_index('note', append=True).swaplevel(1,0).sort_index(level=0)
print (df)
time val
note
C 1 1 4
3 6 9
D 0 1 6
2 4 7
如果需要设置级别名称,请添加DataFrame.rename_axis
:
df = (sample_df.rename_axis('idx')
.set_index('note',append=True)
.swaplevel(1,0)
.sort_index(level=0))
print (df)
time val
note idx
C 1 1 4
3 6 9
D 0 1 6
2 4 7
或者:
sample_df.index.rename('old_index', inplace=True)
sample_df.reset_index(inplace=True)
sample_df.set_index(['note','old_index'], inplace=True)
sample_df.sort_index(level=0, inplace=True)
print (sample_df)
time val
note old_index
C 1 1 4
3 6 9
D 0 1 6
2 4 7
答案 1 :(得分:1)
我正在使用MultiIndex
创建目标索引
sample_df.index=pd.MultiIndex.from_arrays([sample_df.note,sample_df.index])
sample_df.drop('note',1,inplace=True)
sample_df=sample_df.sort_index(level=0)
sample_df
time val
note
C 1 1 4
3 6 9
D 0 1 6
2 4 7
答案 2 :(得分:0)
我将使用set_index
和pop
同时丢弃列“ note”并设置新索引
df.set_index([df.pop('note'), df.index]).sort_index(level=0)
Out[380]:
time val
note
C 1 1 4
3 6 9
D 0 1 6
2 4 7