我有一个状态+ 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
答案 0 :(得分:1)
这是你做的:
states.state_name.ne('DISTRICT OF COLUMBIA')
。对于False
,'DISTRICT OF COLUMBIA'
和其他所有内容True
将为False
。True
首先出现,所有True
出现。如果我们使用稳定排序,则这些mergesort
值将保持相同的顺序。 iloc
是一种稳定的排序。argsort
和states.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}}