如何基于当前值修改Pandas DataFrame的列值?
解决方法
针对你的需求,这里提供两种方案,优先推荐高效矢量化方案(适配4万行的大数据量),另一种是直接复用你现有函数的方案(适合小数据量场景):
方案一:构建反向映射字典(高效,推荐大数据量)
你的lut函数本质是将多个字符串映射到同一个键,先把原有的my_lut转换成值→键的反向字典,再用Pandas的矢量化操作完成映射,比逐行apply快得多,完全适配4万行的规模。
代码示例:
import pandas as pd df = pd.DataFrame({ "A": ["Script","Scrpt","MyScript","Sunday","Monday","qwerty"], "B": ["Song","Blues","Rock","Classic","Whatever","Something"]}) # 构建反向映射字典,把每个值对应到目标键 my_lut = {"Script" : ["Script","Scrpt","MyScript"], "Weekday" : ["Sunday","Monday","Tuesday"]} reverse_lut = {val: key for key, vals in my_lut.items() for val in vals} # 完成映射,未匹配的值填充为'Unknown' df['A'] = df['A'].map(reverse_lut).fillna('Unknown') print(df)
输出结果与你期望的完全一致:
A B 0 Script Song 1 Script Blues 2 Script Rock 3 Weekday Classic 4 Weekday Whatever 5 Unknown Something
方案二:直接使用apply方法(简单但效率低)
如果你想直接复用现有的lut函数,可以用apply逐行处理,但注意4万行数据下效率会远低于方案一,仅适合小数据量测试:
代码示例:
import pandas as pd df = pd.DataFrame({ "A": ["Script","Scrpt","MyScript","Sunday","Monday","qwerty"], "B": ["Song","Blues","Rock","Classic","Whatever","Something"]}) def lut(txt): my_lut = {"Script" : ["Script","Scrpt","MyScript"], "Weekday" : ["Sunday","Monday","Tuesday"]} for key, value in my_lut.items(): if txt in value: return(key) return('Unknown') # 将函数应用到A列 df['A'] = df['A'].apply(lut) print(df)
同样能得到你期望的输出,但大数据量场景下不建议使用。
内容的提问来源于stack exchange,提问作者HoBe
相关产品推荐
相关产品推荐

