按自定义排序规则重新排序数据框行

时间:2017-06-30 19:10:24

标签: python pandas

我有一个状态+ DC的数据帧。它们应按名称排序,但首先是DISTRICT OF COLUMBIA。非原位方法链接操作是首选。

以下效果很好,并且采用我更喜欢的链接方式。但对于如此简单的操作来说,这似乎太复杂了。是否有可能以更清洁的方式做到这一点?

我从

开始
>>> states = pd.DataFrame({
 'state_name': ['ALABAMA', 'DISTRICT OF COLUMBIA', 'WYOMING',], 
 'population': [1000, 2000, 3000]
 })


>>> states
   population            state_name
0        1000               ALABAMA
1        2000  DISTRICT OF COLUMBIA
2        3000               WYOMING

并做

>>> (
     states
    .assign(state_name = lambda x: x.state_name.astype('category', ordered=True))
    .assign(state_name = lambda x:x.state_name.cat.reorder_categories(
        ['DISTRICT OF COLUMBIA']
        +  x.state_name.cat.categories.drop('DISTRICT OF COLUMBIA').tolist())
    )
    .sort_values('state_name')
)

获取

   population            state_name
1        2000  DISTRICT OF COLUMBIA
0        1000               ALABAMA
2        3000               WYOMING

1 个答案:

答案 0 :(得分:1)

这是你做的:

  • 创建一个布尔系列states.state_name.ne('DISTRICT OF COLUMBIA')。对于False'DISTRICT OF COLUMBIA'和其他所有内容True将为False
  • 如果我们对此布尔系列进行排序,则True首先出现,所有True出现。如果我们使用稳定排序,则这些mergesort值将保持相同的顺序。 iloc是一种稳定的排序。
  • 但是,我们需要使用argsortstates.iloc[states.state_name.ne('DISTRICT OF COLUMBIA').argsort(kind='mergesort')] population state_name 1 2000 DISTRICT OF COLUMBIA 0 1000 ALABAMA 2 3000 WYOMING 来获取代表该排序的排列。

很多词语用来形容:

sort_values

您还可以在states.eval( 'dc = state_name != "DISTRICT OF COLUMBIA"', inplace=False ).sort_values('dc', kind='mergesort').drop('dc', 1) population state_name 1 2000 DISTRICT OF COLUMBIA 0 1000 ALABAMA 2 3000 WYOMING

中添加要使用的列
{{1}}