在Python中自定义排序一个分组数据框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python中自定义排序一个分组数据框相关的知识,希望对你有一定的参考价值。
这是我的玩具数据集。
data_test= {'date':[1,1,1,1, 2,2,2,2,2,2,2, 3,3, 4, 4, 4, 4 ],
'cid':[99, 99, 99, 99, 99,99,99,99,99,100,100, 99,99 , 100, 100, 100, 100],
'page':['page1', 'page2', 'page1', 'page2', 'page1', 'page2', 'page3', 'page4', 'page5', 'page3', 'page4','page6', 'page6', 'page7', 'page8', 'page9' ,'page10'],
'campaignset':['c1','c1','c1','c1', 'c1', 'c2','c2','c2','c1','c1','c2','c1', 'c1','c1', 'c2','c2', 'c2']}
data_test_df = pd.DataFrame(data_test)
data_drop_dups = data_test_df.drop_duplicates(['campaignset', 'date', 'page', 'cid'])
data_grouped = data_drop_dups.groupby(['campaignset', 'date', 'page']).cid.size()
data_grouped_df = pd.DataFrame(data_grouped)
这个(data_grouped_df)是写入csv后的样子:
这就是我想要的
我想做一个自定义的排序,把 "page10 "这样的东西放到 "合理 "的顺序位置, 在第9页,第8页,或者第5页之后,不管它前面是什么。我的生产代码最后没有数字。而且它在逻辑上也不是按字母数字顺序排列的。所以生产代码的页面var会有这样的顺序['apple', 'cat', 'igloo', 'banana'......]这就是为什么我创建了下面的排序表,作为我在这个玩具数据集上的尝试之一。
sortlist = ['page1', 'page2', 'page3', 'page4', 'page5', 'page6', 'page7', 'page8', 'page8', 'page9', 'page10']
sorted(data_grouped_df['page'],key = sortlist)
它给了我一个错误。
KeyError: 'page'
我也试过这个
sorted(data_grouped_df['page'], key=lambda data_grouped_df['page']: sortlist))
根据这个帖子: 通过给定的自定义顺序对列表进行排序
它也给我一个错误。
sorted(data_grouped_df['page'], key=lambda data_grouped_df['page']: sortlist))
^
SyntaxError: invalid syntax
有什么见解吗?
谢谢!
更新。
我按照下面的建议试了一下,但对我来说没有用。虽然我 认为 我真正需要的是使用sortlist,而不是str.extr(),因为我的生产代码的var有正确的非字母数字顺序。
df = data_grouped_df.assign(key=data_grouped_df["page"].str.extract("(d+)").astype(int))
.sort_values(
["campaignset", "date", "key"].drop("key", axis=1))
答案
试试
data_grouped_df = data_grouped_df.reset_index()
df = data_grouped_df.assign(key=data_grouped_df["page"].str.extract("(d+)").astype(int))
.sort_values(
["campaignset", "date", "key"].drop("key", axis=1)
print(df)
campaignset date page cid
0 c1 1 page1 1
1 c1 1 page2 1
2 c1 2 page1 1
3 c1 2 page3 1
4 c1 2 page5 1
5 c1 3 page6 1
6 c1 4 page7 1
7 c2 2 page2 1
8 c2 2 page3 1
9 c2 2 page4 2
11 c2 4 page8 1
12 c2 4 page9 1
10 c2 4 page10 1
或使用 pd.Categorical
sortlist = ['page1', 'page2', 'page3', 'page4', 'page5', 'page6', 'page7', 'page8', 'page9', 'page10']
data_grouped_df = data_grouped_df.reset_index()
data_grouped_df['page'] = pd.Categorical(data_grouped_df['page'],categories=sortlist)
df = data_grouped_df.sort_values(['campaignset','date','page'])
print(df)
campaignset date page cid
0 c1 1 page1 1
1 c1 1 page2 1
2 c1 2 page1 1
3 c1 2 page3 1
4 c1 2 page5 1
5 c1 3 page6 1
6 c1 4 page7 1
7 c2 2 page2 1
8 c2 2 page3 1
9 c2 2 page4 2
11 c2 4 page8 1
12 c2 4 page9 1
10 c2 4 page10 1
以上是关于在Python中自定义排序一个分组数据框的主要内容,如果未能解决你的问题,请参考以下文章