根据列值(字符串,子字符串)比较两个数据框并更新另一个列值

Posted

技术标签:

【中文标题】根据列值(字符串,子字符串)比较两个数据框并更新另一个列值【英文标题】:Compare two Dataframes based on column value(String, Substring) and update another column value 【发布时间】:2021-05-01 16:44:27 【问题描述】:

Dataframes df1,df2,其中 df1 Name 列在 df2 Name 列值上有部分匹配的字符串。在名称列值的部分匹配上,然后比较两个数据框的价格列值,如果价格相同,则将 df1 中的列(标志)更新为“删除”

df1

Name Price Flag
VENTILLA HOME FARR 662324.21 Delete
VENTILLA HOME FARR -277961.62
VENTILLA HOME FARR 776011.5
VARAMANT METRO PLANET 662324.21
VARAMANT METRO PLANET 55555.21 Delete
VARAMANT METRO PLANET 267117.5499
FANTHOM STREET LLB 83265.2799
FANTHOM STREET LLB -444452.96 Delete
FANTHOM STREET LLB 267117.5499

df2

my_dict = 'VT METRO PLANET  ': 267117.5499, 'VENTILLA HOME FA ': -277961.62, 'FANTHOM STREET ': 83265.2799
df2 = pd.DataFrame(list(my_dict.items()),columns = ['Name','Price'])

预期输出

任何帮助将不胜感激

【问题讨论】:

如果有人需要更多信息,请告诉我 是的,请使用代码或文本来显示您的输入数据框。 @ScottBoston:在代码和表格中提供了详细信息 你能估计一下会有多少个唯一的“名称”值吗?如果少于 1000 个,您可以使用 df1.Name.unique()df2.Name.unique() 然后构建一个匹配的 df,您可以在其中查找匹配项以供以后比较。如果超过 1000 个名称,则构建该比较表所需的时间将越来越多......一旦你有了那个 df,你可以先将它与 df1 (how="left") 合并结果与df2。然后更新 Flag,因为合并后的表有两个价格。 @576i df1 大约有 1100(唯一 52)行和 16 列,df2 有 82(唯一 14)行和只有 2 列,为了解释,提到了一个有限的示例 【参考方案1】:

我在这里分享的这个问题的解决方案是基于set,所以如果dataframe 1Name至少是共享一个Dataframe 2 的名称 的单词,并且它们的 Price 相等,然后我们将 dataframe 1 中的 Flag 列编辑为 "删除” 否则我们将其设为“无”

此代码来源:

def check(row):
  df1_Name = set(map(lambda word: word.lower(),row.Name.split(' ')))
  df1_price = row.Price
  df1_flag = row.Flag

  for df2_Name, df2_Price in df2[['Name', 'Price']].values:
    df2_Name = set(map(lambda word: word.lower(),df2_Name.split(' ')))
    if len(df1_Name.intersection(df2_Name)) > 1 and df1_price  == df2_Price:
      return 'Delete'
  return '' 

df1["Flag"]= df1.apply(checkMatch,axis=1)

【讨论】:

代替 df1["Flag"] 列,使用附加列 df1["Flag1"] 并从函数返回值。后来添加了代码cond = df1["Flag"] == 'Delete' , df1['Flag'][cond] = df1['Flag1'][cond]

以上是关于根据列值(字符串,子字符串)比较两个数据框并更新另一个列值的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark循环遍历数据框并减少列值

比较两个数据框并更新值

pyspark:删除作为另一列值的子字符串,并从给定列的值中包含正则表达式字符

根据另一列值更新数据框的列

SQL使用子字符串值更新列值[重复]

SQL使用子字符串值更新列值[重复]