用另一个数据帧中的干净 str 替换混乱的 str
Posted
技术标签:
【中文标题】用另一个数据帧中的干净 str 替换混乱的 str【英文标题】:Replace messy str with clean str from another dataframe 【发布时间】: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
【问题讨论】:
【参考方案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\)
应该可以工作:)以上是关于用另一个数据帧中的干净 str 替换混乱的 str的主要内容,如果未能解决你的问题,请参考以下文章
为啥我们在尝试用另一个字符串替换它时使用带有“\”的@ [重复]