根据列值(字符串,子字符串)比较两个数据框并更新另一个列值
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 1的Name至少是共享一个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]
以上是关于根据列值(字符串,子字符串)比较两个数据框并更新另一个列值的主要内容,如果未能解决你的问题,请参考以下文章