Python pandas:基于文本匹配替换值

Posted

技术标签:

【中文标题】Python pandas:基于文本匹配替换值【英文标题】:Python pandas: Replacing value based on Text matching 【发布时间】:2022-01-24 02:51:51 【问题描述】:

我有两个数据框:df1 大约有 20000 行,df2 有 7226 行,如图所示:

df1:

df2:

如果两个数据帧具有相同的 Review_Text 值,我想将 df2 的“最终编码”值复制到 df1 的“最终编码”值。我使用了以下命令:

df1.loc[df1['Review_Text'].isin(df2['Review_Text'],'Final Coding'] = df2['Final Coding']

上述语句的问题在于它没有替换掉df1的所有值。它只替换 df1 的索引号 7226 之前的值,之后不替换任何值。 我尝试了另一个命令如下:

mask = df1['Review_Text'].isin(df2['Review_Text'])==True
df1['Final Coding'] = df1['Final Coding'].where(~mask,df2['Final Coding'],axis=0)

但最终遇到了同样的问题。 我搜索了***的现有线程并找到了另一种方法。 所以我将命令更改如下:

df1.loc[df1['Review_Text'].isin(df2.set_index('Review_Text').index),'Final Coding'] = df2.set_index('Review_Text')['Final Coding']

但是,上面的命令抛出了以下错误:

ValueError: cannot reindex from a duplicate axis

“Review_Text”列中有一些重复的文本,这就是它引发此错误的原因。 我不确定如何克服这个问题。谁能帮我解决这个问题?

【问题讨论】:

独一无二? @Abel 对不起,我不明白??? 鬼鬼祟祟的玩笑。听起来您想将 df2 转换为查找,但它多次出现您想要使用的键值对。可以为您的键(和值)创建一个 df,然后运行唯一的并提取相关的用于查找。或者可以做类似***.com/a/67343461/14237276 的事情来通过分组来减少它。 【参考方案1】:

你可以的

以下之前更新:

df1.reset_index(inplace=True, drop=True)
df2.reset_index(inplace=True, drop=True)

#==================================
m = df1['Review_Text'].isin(df2['Review_Text'])
v = df1['Review_Text'].map(df2.set_index('Review_Text')['Final Coding'])
df1.loc[m,'Final Coding'] = v

或者我们可以这样做

df1.update(df1['Review_Text'].map(df2.set_index('Review_Text')['Final Coding']).to_frame('Review_Text'))

【讨论】:

感谢发帖。当我运行 df1.update 命令或第一个解决方案的第二行时,我收到错误消息“InvalidIndexError: Reindexing only valid with unique value Index objects” @user2293224 你有重复索引,试试reset_index(),我会更新

以上是关于Python pandas:基于文本匹配替换值的主要内容,如果未能解决你的问题,请参考以下文章

当列值匹配时,Pandas Dataframe 从一行中替换 Nan

python 替换Pandas中的缺失值(NaN)(Python)

100天精通Python(数据分析篇)——第73天:Pandas文本数据处理方法之查找替换拼接正则虚拟变量

合并 Pandas Dataframe:如何添加列和替换值

100天精通Python(数据分析篇)——第73天:Pandas文本数据处理方法之查找替换拼接正则虚拟变量

Pandas - 根据索引替换值