在group by的键中排序

时间:2017-01-26 03:24:51

标签: pandas

我有一个按表格分组,我想按键index中的['CPUCore', Offline_RetetionAge']排序(需要保留['CPUCore', Offline_RetetionAge']的结构)我该怎么做?

enter image description here

2 个答案:

答案 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.partialDataFrame.apply

输出:

                              index           bla
 CPUCore Offline_RetentionAge                     
 2       11                        4        create
         1000                      5             a
         10                       11  reproducible
         100                      16       example
 3       512                       9             !

答案 1 :(得分:1)

我认为您的第二级问题dtypeobject,显然是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