如何在含元组的Pandas DataFrame中使用DataFrame.replace?
解决pandas中用元组作为replace字典键的报错问题
你遇到的问题是因为pandas的replace方法在处理object类型列中的元组时,会将元组拆解成ndarray元素去匹配,导致无法和字典里的元组键直接对比,从而抛出类型错误。下面是两种实用的解决方法:
方法一:使用apply逐个替换元素
直接对列中的每个元组对象进行字典查找,apply会保留元组的原始类型,不会拆解它们:
import pandas as pd toy_df = pd.DataFrame({'col0': [('Hello','Sarah!'),('Bye', 'my', 'dear', 'Beth')]}) toy_dict = {('Hello','Sarah!') : ('oh,', 'you', 'again'), ('Bye', 'my', 'dear', 'Beth'):('xoxo',)} # 用apply遍历每个元素,从字典中获取替换值,找不到则保留原元素 toy_df['col0'] = toy_df['col0'].apply(lambda x: toy_dict.get(x, x)) print(toy_df)
运行后输出:
col0 0 (oh,, you, again) 1 (xoxo,)
方法二:将元组转为哈希able的字符串(可选)
如果你的元组内容不含特殊分隔符,也可以先把元组转成字符串,替换后再转回元组:
# 元组转字符串 toy_df['col0_str'] = toy_df['col0'].apply(str) # 构建字符串键的字典 str_dict = {str(k): str(v) for k, v in toy_dict.items()} # 替换后转回元组 toy_df['col0'] = toy_df['col0_str'].replace(str_dict).apply(eval) # 删掉临时列 toy_df.drop('col0_str', axis=1, inplace=True) print(toy_df)
注意:这种方法依赖eval,如果元组内容有安全风险(比如来自不可信数据源),不建议使用,方法一更安全可靠。
内容的提问来源于stack exchange,提问作者Seno
相关产品推荐
相关产品推荐

