概述
In [48]: import pandas as pd
...:
...: # 读取文件
...: df = pd.read_excel('data.xlsx')
...:
...: # 按照city进行分组,并按照date升序排序
...: new_df = df.sort_values(['date']).groupby('city')
...:
...: # 取出结果中的每一行拼接成新的dataframe
...: data_list = [pd.DataFrame(row) for head, row in new_df]
...: res_df = pd.concat(data_list)
...: res_df
如果需要自定义city的顺序,可以使用pd.Categorical修改city的顺序。
res_df["city"] = pd.Categorical(df["city"],["广州","南京","杭州","北京","上海"])
res = res_df.sort_values("city")
res
如果要自动生成特定的自定义城市顺序,只需要通过程序生成
["广州","南京","杭州","北京","上海"]
这个列表。
这个程序的生成逻辑是:原始表的城市名去倒序排列,后保持顺序去重。
In [9]: df['city'].values.tolist()[::-1]
Out[9]: ['广州', '广州','广州', '广州', '南京', '南京', '南京', '南京', '杭州', '杭州', '杭州', '北京', '北京', '广州', '上海']
直接set去重会破坏顺序,需要自定义一个函数
def remove_duplicate(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
return list(seen)
因此,最后列表生成的方法为:
city_order = remove_duplicate(df['city'].values.tolist()[::-1])
最终代码:
import pandas as pd
df = pd.read_excel('data.xlsx')
new_df = df.sort_values(['date']).groupby('city')
data_list = [pd.DataFrame(row) for head, row in new_df]
res_df = pd.concat(data_list)
def remove_duplicate(items):
seen = set()
for item in items:
if item not in seen:
yield item
seen.add(item)
return list(seen)
city_order = remove_duplicate(df['city'].values.tolist()[::-1])
res_df["city"] = pd.Categorical(df["city"],city_order)
# 重排后顺序会乱,再增加date修正
res = res_df.sort_values(["city","date"])
res
最后结果:
city date
2 广州 2020-01-17
4 广州 2020-01-19
5 广州 2020-01-20
6 广州 2020-01-21
14 广州 2020-01-29
1 南京 2020-01-16
11 南京 2020-01-26
12 南京 2020-01-27
13 南京 2020-01-28
8 杭州 2020-01-23
9 杭州 2020-01-24
10 杭州 2020-01-25
3 北京 2020-01-18
7 北京 2020-01-22
0 上海 2020-01-15
修改原始数据后,最终的结果如下
city date
5 广宁 2020-01-20
6 广宁 2020-01-21
2 广州 2020-01-17
4 广州 2020-01-19
12 广州 2020-01-27
13 广州 2020-01-28
14 广州 2020-01-29
1 南京 2020-01-16
11 南京 2020-01-26
15 南京 2020-01-30
16 南京 2020-01-31
8 杭州 2020-01-23
9 杭州 2020-01-24
10 杭州 2020-01-25
3 北京 2020-01-18
7 北京 2020-01-22
0 上海 2020-01-15
根据城市的出现的个数倒序进行排列的代码如下:
import pandas as pd
df = pd.read_excel('data.xlsx')
new_df = df.sort_values(['date']).groupby('city')
data_list = [pd.DataFrame(row) for head, row in new_df]
res_df = pd.concat(data_list)
from collections import Counter
city_counter = Counter(df['city'].values.tolist())
city_order = [k for k, v in sorted(city_counter.items(), key=lambda item:item[1], reverse=True)]
res_df["city"] = pd.Categorical(df["city"],city_order)
# 重排后顺序会乱,再增加date修正
res = res_df.sort_values(["city","date"])
res
结果如下:
city date
2 广州 2020-01-17
4 广州 2020-01-19
12 广州 2020-01-27
13 广州 2020-01-28
14 广州 2020-01-29
1 南京 2020-01-16
11 南京 2020-01-26
15 南京 2020-01-30
16 南京 2020-01-31
8 杭州 2020-01-23
9 杭州 2020-01-24
10 杭州 2020-01-25
3 北京 2020-01-18
7 北京 2020-01-22
5 广宁 2020-01-20
6 广宁 2020-01-21
0 上海 2020-01-15
最后
以上就是落后背包为你收集整理的python pandas 排序_python pandas排序问题的全部内容,希望文章能够帮你解决python pandas 排序_python pandas排序问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复