在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后的样子:

enter image description here

这就是我想要的

enter image description here

我想做一个自定义的排序,把 "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中自定义排序一个分组数据框的主要内容,如果未能解决你的问题,请参考以下文章

C#中自定义一组随机数据,怎么把数据在文本框中显示?而且数据是按顺序动态的显示到界面上,求大神们指点

VS Code中自定义Emmet代码片段

python中自定义排序函数

活动中自定义对话框内的 ANDROID 片段

Python Pandas 索引排序/分组/日期时间

在echarts中自定义提示框内容