如何在Pandas列的列表中重命名值并保留唯一值
解决Pandas DataFrame列表列的元素替换与去重问题
首先,你当前的代码存在一个核心问题:df["matches"].str.replace("pink","red") 是针对字符串的替换操作,但matches列的元素是列表类型。这样处理会把整个列表转换成字符串后再做替换,最终得到的是字符串而非列表,而且没法批量处理多个替换规则,更没实现去重的需求。
下面是完全贴合你需求的完整解决方案:
步骤1:定义替换规则与处理函数
我们先明确替换映射关系,再通过apply遍历每个列表的元素完成替换,最后对替换后的列表做去重处理。
import pandas as pd # 构建你的示例数据 data = { "text": ["flowers are red.", "airplanes are blue.", "xxxxxxxx"], "matches": [["red", "yellow", "pink"], ["blue", "indigo"], ["orange"]] } df = pd.DataFrame(data) # 定义替换规则:键是原元素值,值是要替换成的目标值 replace_rules = { "pink": "red", "yellow": "red", "blue": "indigo" } # 处理元素替换的函数:遍历列表每个元素,应用替换规则 def apply_replace(lst): # 先清理元素前后的空格(比如处理示例中[blue, indigo]里的空格) cleaned_items = [item.strip() for item in lst] # 对每个元素应用替换,不在规则里的元素保持原样 return [replace_rules.get(item, item) for item in cleaned_items] # 处理去重的函数:保留元素原始顺序的同时去重(Python 3.7+支持) def get_unique(lst): return list(dict.fromkeys(lst))
步骤2:生成rename和final列
把上面的函数应用到DataFrame的matches列,生成你需要的结果列:
# 生成rename列:完成所有元素的替换操作 df["rename"] = df["matches"].apply(apply_replace) # 生成final列:对替换后的列表去除重复值 df["final"] = df["rename"].apply(get_unique)
最终输出结果
运行代码后得到的DataFrame如下:
text matches rename final 0 flowers are red. [red, yellow, pink] [red, red, red] [red] 1 airplanes are blue. [blue, indigo] [indigo, indigo] [indigo] 2 xxxxxxxxx [orange] [orange] [orange]
关于你给出的期望输出说明
你提供的期望输出中,airplanes are blue.行的rename是[blue, blue]、final是[blue],这和你描述的“blue替换为indigo”规则不符。如果实际需求是把indigo替换为blue,只需修改替换规则字典为:
replace_rules = { "pink": "red", "yellow": "red", "indigo": "blue" }
调整后就能得到你示例中的期望结果。
内容的提问来源于stack exchange,提问作者CPDatascience
相关产品推荐
相关产品推荐

