我有一个按表格分组,我想按键index
中的['CPUCore', Offline_RetetionAge']
排序(需要保留['CPUCore', Offline_RetetionAge']
的结构)我该怎么做?
答案 0 :(得分:1)
我认为你的意思是这样的: 将pandas导入为pd 来自pandas import Series,DataFrame
# create what I believe you tried to ask
df = DataFrame( \
[[11,'reproducible'], [16, 'example'], [5, 'a'], [4, 'create'], [9,'!']])
df.columns = ['index', 'bla']
df.index = pd.MultiIndex.from_arrays([[2]*4+[3],[10,100,1000,11,512]], \
names=['CPUCore', 'Offline_RetentionAge'])
# sort by values and afterwards by index where sort_remaining=False preserves
# the order of index
df = df.sort_values('index').sort_index(level=0, sort_remaining=False)
print df
语句sort_values
按索引对值进行排序,sort_index
按多重索引恢复分组,而不更改具有相同CPUCore
的行的索引顺序。
我不知道"分组是什么?#34;应该是。如果你有一个pd.GroupBy对象,你将无法像这样使用sort_values()。
您可能需要重新考虑分组内容或使用functools.partial
和DataFrame.apply
输出:
index bla
CPUCore Offline_RetentionAge
2 11 4 create
1000 5 a
10 11 reproducible
100 16 example
3 512 9 !
答案 1 :(得分:1)
我认为您的第二级问题dtype
为object
,显然是string
,所以如果使用sort_index
,它会对字母数字进行排序:
df = pd.DataFrame({'CPUCore':[2,2,2,3,3],
'Offline_RetetionAge':['100','1','12','120','15'],
'index':[11,16,5,4,3]}).set_index(['CPUCore','Offline_RetetionAge'])
print (df)
index
CPUCore Offline_RetetionAge
2 100 11
1 16
12 5
3 120 4
15 3
print (df.index.get_level_values('Offline_RetetionAge').dtype)
object
print (df.sort_index())
index
CPUCore Offline_RetetionAge
2 1 16
100 11
12 5
3 120 4
15 3
#change multiindex - cast level Offline_RetetionAge to int
new_index = list(zip(df.index.get_level_values('CPUCore'),
df.index.get_level_values('Offline_RetetionAge').astype(int)))
df.index = pd.MultiIndex.from_tuples(new_index, names = df.index.names)
print (df.sort_index())
index
CPUCore Offline_RetetionAge
2 1 16
12 5
100 11
3 15 3
120 4
通过评论编辑:
print (df.reset_index()
.sort_values(['CPUCore','index'])
.set_index(['CPUCore','Offline_RetetionAge']))
index
CPUCore Offline_RetetionAge
2 12 5
100 11
1 16
3 15 3
120 4