在实际业务中,我们经常会遇到这样的需求:

  • 将中文姓名转换为拼音
  • 支持通过拼音或拼音首字母搜索中文姓名
  • 结合 Pandas 对数据进行批量处理

本文将基于 pypinyin + pandas,实现一个优雅且实用的中文姓名拼音转换与搜索方案

一、环境准备

安装依赖

1

pip install pandas pypinyin

导入必要的库

1

2

import pandas as pd

from pypinyin import pinyin, Style

二、示例数据准备

假设我们有一列中文姓名数据:

1

2

3

4

5

data = {

    'name': ['张三', '李四', '王小五', '赵六']

}

df = pd.DataFrame(data)

当前 DataFrame 结构如下:

name
张三
李四
王小五
赵六

三、实现姓名拼音转换函数

我们希望实现两个拼音字段:

  • full_pinyin:姓名全拼(如 zhangsan
  • initials:姓全拼 + 名首字母(如 zhangs

核心函数实现

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

def get_full_pinyin_and_initials(name):

    """

    将中文姓名转换为:

    1. 全拼

    2. 姓全拼 + 名首字母

    """

    # 全拼(张三 -> zhangsan)

    full_pinyin = ''.join(

        pinyin(name, style=Style.NORMAL)[i][0]

        for i in range(len(name))

    )

    # 姓的全拼

    surname_pinyin = pinyin(name[0], style=Style.NORMAL)[0][0]

    # 名的首字母

    name_initials = pinyin(name[1:], style=Style.FIRST_LETTER)

    initials = surname_pinyin + ''.join(i[0] for i in name_initials)

    return full_pinyin, initials

四、批量生成拼音字段

使用 apply + pd.Series,将返回的元组拆分成多个列:

1

2

3

4

5

df[['full_pinyin', 'initials']] = (

    df['name']

    .apply(get_full_pinyin_and_initials)

    .apply(pd.Series)

)

处理后的 DataFrame:

name full_pinyin initials
张三 zhangsan zhangs
李四 lisi lis
王小五 wangxiaowu wangxw
赵六 zhaoliu zhaol

五、实现拼音搜索功能

支持以下两种搜索方式:

  • 全拼搜索
  • 拼音首字母搜索

搜索函数实现

1

2

3

4

5

6

7

8

9

10

11

def find_name_by_pinyin(input_pinyin):

    """

    根据拼音或拼音首字母查找姓名

    """

    matched_names = df[

        df['initials'].str.contains(input_pinyin, na=False) |

        df['full_pinyin'].str.contains(input_pinyin, na=False)

    ]

    return matched_names

六、使用示例

1

2

3

4

input_pinyin = "zhangs"

result = find_name_by_pinyin(input_pinyin)

print(result)

输出结果:

  name full_pinyin initials
0  张三    zhangsan   zhangs

七、完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

import pandas as pd

from pypinyin import pinyin, Style

# 假设你的 DataFrame 是这样的

data = {

    'name': ['张三', '李四', '王小五', '赵六']

}

df = pd.DataFrame(data)

# 定义获取拼音的函数

def get_full_pinyin_and_initials(name):

    # 获取全拼

    full_pinyin = ''.join(pinyin(name, style=Style.NORMAL)[i][0] for i in range(len(name)))

    # 获取姓的拼音和名的首字母

    surname_pinyin = pinyin(name[0], style=Style.NORMAL)[0][0# 姓的全拼

    name_initial = pinyin(name[1:], style=Style.FIRST_LETTER)  # 名的首字母

    initials = surname_pinyin + ''.join(n[0] for n in name_initial)

    return full_pinyin, initials

# 应用函数并创建新的列

df[['full_pinyin', 'initials']] = df['name'].apply(get_full_pinyin_and_initials).apply(pd.Series)

# 定义查找姓名的函数

def find_name_by_pinyin(input_pinyin):

    # 查找与输入拼音匹配的姓名

    matched_names = df[df['initials'].str.contains(input_pinyin, na=False) |

                        df['full_pinyin'].str.contains(input_pinyin, na=False)]

    return matched_names

# 示例:查找拼音

input_pinyin = "zhangs"  # 你想要查找的拼音

result = find_name_by_pinyin(input_pinyin)

# 打印结果

print(result)

以上就是Python+pypinyin实现将中文姓名拼音转换与搜索的详细内容

更多推荐