【问题标题】:Python pandas: Replacing value based on Text matchingPython pandas:基于文本匹配替换值
【发布时间】: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)

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

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,然后运行唯一的并提取相关的用于查找。或者可以做类似stackoverflow.com/a/67343461/14237276 的事情来通过分组来减少它。

标签: python python-3.x pandas


【解决方案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(),我会更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2014-05-12
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
相关资源
最近更新 更多