pandas實現中文排序

2021-10-09 21:15:07 字數 2385 閱讀 2543

在我們使用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...