原始数据的excel表格,如下图
想用python的pandas把excel变成按相同地点和按相同地点的数量由大到小排序,如下图
逻辑上没那么复杂,添加个计数辅助列,然后多列排序完事:
import pandas as pd
from io import StringIO
data = """
city,date
上海,2020/1/15
南京,2020/1/16
广州,2020/1/17
北京,2020/1/18
广州,2020/1/19
广宁,2020/1/20
广宁,2020/1/21
北京,2020/1/22
杭州,2020/1/23
杭州,2020/1/24
杭州,2020/1/25
南京,2020/1/26
广州,2020/1/27
广州,2020/1/28
广州,2020/1/29
南京,2020/1/30
南京,2020/1/31
"""
df = pd.read_csv(StringIO(data))
df = df.merge(
df.groupby("city", as_index=False).count().rename(columns={"date": "count"}),
how="left",
on="city",
).sort_values(by=["count", "city", "date"], ascending=[0, 0, 1])
print(df)
执行结果:
city date count
2 广州 2020/1/17 5
4 广州 2020/1/19 5
12 广州 2020/1/27 5
13 广州 2020/1/28 5
14 广州 2020/1/29 5
1 南京 2020/1/16 4
11 南京 2020/1/26 4
15 南京 2020/1/30 4
16 南京 2020/1/31 4
8 杭州 2020/1/23 3
9 杭州 2020/1/24 3
10 杭州 2020/1/25 3
3 北京 2020/1/18 2
5 广宁 2020/1/20 2
6 广宁 2020/1/21 2
7 北京 2020/1/22 2
0 上海 2020/1/15 1
注意,既然使用了 Pandas 就尽量不要使用 Python 原生列表类操作,用 pandas/numpy 相关函数替代,否则数据量大的时候会非常慢,能差几个数量级?
利用一下楼上数据
import pandas as pd
from io import StringIO
data = """
city,date
上海,2020/1/15
南京,2020/1/16
广州,2020/1/17
北京,2020/1/18
广州,2020/1/19
广宁,2020/1/20
广宁,2020/1/21
北京,2020/1/22
杭州,2020/1/23
杭州,2020/1/24
杭州,2020/1/25
南京,2020/1/26
广州,2020/1/27
广州,2020/1/28
广州,2020/1/29
南京,2020/1/30
南京,2020/1/31
"""
a = pd.read_csv(StringIO(data))
a['b'] = a.city.apply(lambda x:a.city.value_counts()[x])
a.sort_values(by=['b','date'],ascending=[False,False])
3 回答3.4k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
如果需要自定义city的顺序,可以使用pd.Categorical修改city的顺序。
如果要自动生成特定的自定义城市顺序,只需要通过程序生成
这个列表。
这个程序的生成逻辑是:原始表的城市名去倒序排列,后保持顺序去重。
直接set去重会破坏顺序,需要自定义一个函数
因此,最后列表生成的方法为:
最终代码:
最后结果:
修改原始数据后,最终的结果如下
根据城市的出现的个数倒序进行排列的代码如下:
结果如下: