【问题标题】:Replace messy str with clean str from another dataframe用另一个数据帧中的干净 str 替换混乱的 str
【发布时间】:2019-10-09 14:48:54
【问题描述】:

我有 2 组数据框,如果 df1['Fruits'] 包含 df2['Fruits'] 字符串,我想清理它

df1
Name    Fruits
--------------
Dina    Pineapple, [Y*]
Maria   PTC*, Apple
Johny   Durian, 1-6
Johny   5,6 Rambutan
Maria   Apple (Red), [Y] *
Dina    [Y] *, Peach88
Dina    Kiwi/Qiwi, PS*

df2
Fruits      tag
-------------
Apple       20
Pineapple   30
Rambutan    40
Durian      50
Apple (Red) 25
Peach88     55
Kiwi/Qiwi   25

我试过了

df1.loc[df1['Fruits'].contains(df2['Fruits']),'Fruits'] = df2['Fruits']

但它显示

“系列”对象没有“包含”属性

所以我期望得到的是

df1
Name    Fruits
--------------
Dina    Pineapple
Maria   Apple
Johny   Durian
Johny   Rambutan
Maria   Apple (Red)
Dina    Peach88
Dina    Kiwi/Qiwi

【问题讨论】:

    标签: python string pandas contains


    【解决方案1】:

    使用pandas.Series.str.extract:

    reg = '(%s)' % '|'.join(df2['Fruits'])
    # Make regex expression using df2['Fruits']
    df1['Fruits'] = df1['Fruits'].str.extract(reg)
    

    输出:

        Name     Fruits
    0   Dina  Pineapple
    1  Maria      Apple
    2  Johny     Durian
    3  Johny   Rambutan
    

    '(%s)' % '|'.join(df2['Fruits'])的解释:

    • '|'.join(df2['Fruits']):为正则表达式中的or 操作创建| 分隔词。返回Pineapple|Apple|Durian|Rambutan
    • (%s) % ... :这称为字符串格式化,相当于:
      • str.format'({})'.format('|'.join(df2['Fruits']))
      • 或更多隐含(但更少pythonic)'(' + '|'.join(df2['Fruits']) + ')'
      • 所有这些都返回(Apple|Pineapple|Rambutan|Durian),一个捕获组pd.Series.str.extract 必须知道要提取什么。

    【讨论】:

    • 效果很好!谢谢!,我将不得不研究正则表达式
    • 谷歌搜索后我找不到'(%s)' % 的工作原理,我知道( ) 是将多个标记组合在一起,'|' 是分隔符,但我找不到%s 和%,升技能解释一下吗? :)
    • @espifi059espifi059 我已经更新了答案。如果有什么不清楚的地方请告诉我:)
    • 非常感谢!但是我遇到的另一个问题是,如果水果字符串包含括号(我已经更新了我的问题),并且当我运行 str.extract 时,它无法匹配字符串,所以我做了一个解决方法,将(Red) 替换为iii 并在提取过程后替换回来。问题是我需要转义括号吗?
    • @espifi059espifi059 是的。当涉及到正则表达式时,括号被解释为捕获组的指示符。将(Red) 变成\(Red\) 应该可以工作:)
    猜你喜欢
    • 2021-10-13
    • 2019-05-25
    • 2015-10-06
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2015-12-19
    • 2019-08-06
    相关资源
    最近更新 更多