You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas.assign()生成Soundex列遇重复值及索引报错问题

解决Pandas assign添加Soundex列重复值及索引问题

我来帮你搞定这个问题!你的核心问题是没有逐行对每个字符串调用Soundex函数,而是把整个Series转成了一个大字符串,导致只计算了一次结果,所有行重复。另外设置索引后的报错是因为索引列不再是DataFrame的普通列了,访问方式需要调整。

问题原因分析

当你写jellyfish.soundex(str(df1['name1']))时,str(df1['name1'])会把整个name1列的Series转换成一个包含所有行的长字符串(比如类似"0 Yolanda\n1 Push Notify\n2 Yolanda\n..."),jellyfish只会对这个长字符串计算一次Soundex值,所以新列所有行都重复这个结果。哪怕用lambda写法,如果还是处理整个Series而非单个元素,结果还是一样。

正确的解决方案

1. 普通列场景(name1不是索引)

我们需要对name1列的每个元素单独调用jellyfish.soundex,可以用apply方法实现:

import pandas as pd
import jellyfish

# 读取数据(不要提前设置索引)
df1 = pd.read_csv('C:\\path\\my.csv', header=0)

# 正确的assign写法:对每个元素应用Soundex
df2 = df1.assign(soundexMd5=lambda x: x['name1'].apply(jellyfish.soundex))

print(df2)

或者更直接的写法:

df2 = df1.assign(soundexMd5=df1['name1'].apply(jellyfish.soundex))

这样处理后,每行的soundexMd5都会对应name1列该行的正确Soundex值:

  • Yolanda → Y453
  • Push Notify → P253
  • test1 → T231
  • test2 → T232

2. name1设为索引的场景

如果要把name1设为索引,需要注意:索引不属于DataFrame的列,不能直接用x.name1或x['name1']访问,要先把索引转成Series再处理:

# 读取并设置name1为索引
df1 = pd.read_csv('C:\\path\\my.csv', header=0).set_index('name1')

# 对索引列应用Soundex
df2 = df1.assign(soundexMd5=lambda x: x.index.to_series().apply(jellyfish.soundex))

print(df2)

这样就能避免KeyError或AttributeError,同时正确计算每行的Soundex值。

内容的提问来源于stack exchange,提问作者Ron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:52:03