gpt4 book ai didi

python - 通过自定义排序规则对数据框行重新排序

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:43 24 4
gpt4 key购买 nike

我有一个状态+ 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

最佳答案

这就是你要做的:

  • 创建一个 bool 系列states.state_name.ne('DISTRICT OF COLUMBIA')。对于 'DISTRICT OF COLUMBIA' 来说,这将为 False,对于其他所有内容,这将为 True
  • 如果我们对这个 bool 系列进行排序,False 排在前面,所有 True 排在后面。如果我们使用稳定排序,那么这些 True 值将保持相同的顺序。 mergesort 是一种稳定的排序。
  • 但是,我们需要将 ilocargsort 结合使用来获取表示该排序的排列。

用很多词来描述这一点:

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

关于python - 通过自定义排序规则对数据框行重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com