【问题标题】:Vlookup function / merge Pandas but not exact matchVlookup 函数/合并 Pandas 但不完全匹配
【发布时间】:2021-12-22 19:09:10
【问题描述】:

我有一个数据框 df1:

Column1      Column2    Column3    Value
000_abc111   Def _ 1    xyz876     Box1
Def _ 1      11111ghi   Def _ 1    Box2
23uvw-00-11  Def _ 1    Def _ 1    Box3

另一个df2:

To_Check
abc
xyza
ghi
xyz
uvw

在 1,2 和 3 列(几乎有 20 列)中搜索 df2 的值并返回值列中的值。

结果df:

To_Check    Value
abc         Box1
xyza    
ghi         Box2
xyz         Box1
uvw         Box3

pandas 中的 merge、map 和 isin 函数可用于精确匹配,但由于数据包含数字、特殊字符和列中的宽空格,因此无法弄清楚(文件为 csv)。

谢谢。

【问题讨论】:

  • 如果每行有多个值匹配会发生什么?需要多行输出?

标签: python pandas merge special-characters vlookup


【解决方案1】:

DataFrame.set_indexDataFrame.stack 一起用于Series,然后通过Series.str.extractall 获取所有匹配的值,最后使用DataFrame.merge 与左连接:

s = df1.set_index('Value').stack()
df3 = s.str.extractall(f'({"|".join(df2["To_Check"])})')[0].reset_index(name='To_Check')

df = df2.merge(df3[['To_Check','Value']], how='left', on='To_Check')
print (df)
  To_Check Value
0      abc  Box1
1     xyza   NaN
2      ghi  Box2
3      xyz  Box1
4      uvw  Box3

如果多个值匹配:

print (df1)

       Column1   Column2     Column3 Value
0   000_abc111   Def _ 1      xyz876  Box1
1      Def _ 1  11111ghi  Def _abc 1  Box2 <- added abc
2  23uvw-00-11   Def _ 1     Def _ 1  Box3


s = df1.set_index('Value').stack()
df3 = s.str.extractall(f'({"|".join(df2["To_Check"])})')[0].reset_index(name='To_Check')

df = df2.merge(df3[['To_Check','Value']], how='left', on='To_Check')
print (df)
  To_Check Value
0      abc  Box1
1      abc  Box2 <- 2 rows for abc
2     xyza   NaN
3      ghi  Box2
4      xyz  Box1
5      uvw  Box3

或通过groupbyjoin 连接多个值:

s = df1.set_index('Value').stack()
df3 = (s.str.extractall(f'({"|".join(df2["To_Check"])})')[0]
       .reset_index(name='To_Check')
        .groupby('To_Check')['Value'].agg(','.join)

df = df2.join(df3, on='To_Check')
print (df)
  To_Check      Value
0      abc  Box1,Box2
1     xyza        NaN
2      ghi       Box2
3      xyz       Box1
4      uvw       Box3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 2019-02-28
    • 2020-01-20
    • 1970-01-01
    • 2020-01-11
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多