在我們使用pandas過程中有時會遇到排序,尤其是中文排序,例如excel排序,按姓名拼音排序等等,而pandas預設的排序並不能滿足我們的中文排序,所以有了這個中文排序方式
一、首先實現中文的拼音排序
def to_pinyin(s):
'''轉拼音
:param s: 字串或列表
:type s: str or list
:return: 拼音字串
>>> to_pinyin('你好嗎') 'ni3hao3ma'
>>> to_pinyin(['你好', '嗎'])'ni3hao3ma'
'''return ''.join(chain.from_iterable(pinyin(s, style=style.tone3)))
二、利用pandas自定義排序
# 自定義排序 (先取列內容 去重,按拼音排序)
df_tmp['cnt'] = pd.categorical(df_tmp['cnt'], categories=new_list, ordered=true)
df_tmp.sort_values(by='cnt', inplace=true)
最後獻上完整**
# -*- coding: utf-8 -*-
from itertools import chain
from pypinyin import pinyin, style
import pandas as pd
''''''
def to_pinyin(s):
'''轉拼音
:param s: 字串或列表
:type s: str or list
:return: 拼音字串
>>> to_pinyin('你好嗎') 'ni3hao3ma'
>>> to_pinyin(['你好', '嗎'])'ni3hao3ma'
'''return ''.join(chain.from_iterable(pinyin(s, style=style.tone3)))
if __name__ == '__main__':
# print(sorted(['美國', '中國', '日本']))
# print(sorted(['美國', '中國', '日本'], key=to_pinyin))
df_tmp = pd.dataframe([
, , ,
, ,
])# print(df_tmp)
# pandas預設排序--仍為亂序
df_tmp.sort_values(by="cnt", inplace=true)
print(df_tmp)
# 獲取dataframe指定列數值,並以列表形式返回
sort_values_list = df_tmp[:]["cnt"].values.tolist()
# 中文排序
new_list = sorted(sort_values_list, key=to_pinyin)
# print(new_list)
# 自定義排序 (先取列內容 去重,按給定順序排序)
df_tmp['cnt'] = pd.categorical(df_tmp['cnt'], categories=new_list, ordered=true)
df_tmp.sort_values(by='cnt', inplace=true)
# 重置行序號 index
df_tmp.reset_index(drop=true, inplace=true)
print(df_tmp)
'''aa cnt b
0 data2 魅力惠b3305 22
1 data2 魅力惠b3308 22
2 data4 你好a 22
3 data4 你好b 22
4 data2 **彙總 22
5 data1 總開通 20
'''
最後說明:
pandas預設的排序,不支援中文拼音排序,如果使用中文拼音排序需要自定義,
支援:純中文 + 數字 + 純大/小寫字母 或 可接受大寫在前小寫在後的字母排序
不支援:小寫字母在前,大寫在後
目前原因:在ascii碼裡,大寫字母數值較小,小寫字母數值較大
pandas 透視表中文字段排序
前幾天有乙個需求,透視表中的年級這一列要按照一年級,二年級這樣的序列進行排序,但是用過透視表的人都知道,透視表對中文的排序不是太理想,放棄pandas自帶的排序方法。測試了很久,想到乙個辦法。先把dataframe中需要特殊排序的列中的漢字轉換成數字,然後生成透視表,生成透視表之後,再把透視表的in...
pandas 排序 Pandas 資料排序
python 的 pandas 庫中有一類對資料排序的方法,主要分為對引數列排序,對數值排序,及二者混合三種。一.引數列排序 首先我們生成乙個亂序數列 unsorted df 隨後我們可通過 df.sort index 函式對資料集進行排序操作 如不做規定,返回行引數正序排序 新增引數 ascend...
pandas 透視表中文字段排序方法
前幾天有乙個需求,透視表中的年級這一列要按照一年級,二年級這樣的序列進行排序,但是用過透視表的人都知道,透視表對中文的排序不是太理想,放棄pandas自帶的排序方法。測試了很久,想到乙個辦法。先把dataframe中需要特殊排序的列中的漢字轉換成數字,然後生成透視表,生成透視表之後,再把透視表的in...