使用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
相关产品推荐
相关产品推荐

