【问题标题】:Pandas: matching a string in series with string from another series熊猫:将串联的字符串与另一个系列的字符串匹配
【发布时间】:2014-06-26 00:21:07
【问题描述】:

我有一个如下所示的 DataFrame:

Full                          Partial
ABCDEFGHIJKLMNOPQRSTUVWXYZ    FGHIJKL
ANLHDFKNADHFBAKHFGBAKJFB      FKNADH
JABFKADFNADKHFBADHBFJDHFBADF  ABFKA

我想要做的是将Full 中与Partial 不匹配的所有内容都用小写字母,产生以下内容:

Coverage
abcdef_GHIJKL_mnopqrstuvwxyz
anlhd_FKNADH_fbakhfgbakjfb
j_ABFKA_dfnadkhfbadhbfjdhfbadf

我该怎么做?我环顾四周,似乎series.str.extract() 可能是一个解决方案,但我不确定何时尝试这样做:

df['Full'].str.extract(data['Partial'])

...它只是说 Series 不能是可散列的。我假设extract 只接受一个参数,而不是一个系列?有没有办法绕过这个? extract 甚至是实现我正在寻找的正确方法,还是有其他方法?我想我也许可以找到一些方法来提取字符串索引并执行以下伪代码:

df['Coverage'] = data['Full'][:start].lower() + '_' + data['Partial'] + \
     '_' + data['Full'][End:].lower()

... 其中StartEnd 分别是data['Partial'] 开始和结束位置的索引。想法?

【问题讨论】:

    标签: python string python-3.x pandas match


    【解决方案1】:

    也许不是最优雅的,但这里有一个解决方案:

    对于 df:

                               Full  Partial
    0    ABCDEFGHIJKLMNOPQRSTUVWXYZ  FGHIJKL
    1      ANLHDFKNADHFBAKHFGBAKJFB   FKNADH
    2  JABFKADFNADKHFBADHBFJDHFBADF    ABFKA
    

    这个:

    df.apply(lambda r: r.Full.lower().replace(r.Partial.lower(), '_' + r.Partial + '_'), axis=1)
    

    返回:

    0      abcde_FGHIJKL_mnopqrstuvwxyz
    1        anlhd_FKNADH_fbakhfgbakjfb
    2    j_ABFKA_dfnadkhfbadhbfjdhfbadf
    

    对于每一行,您将完整字符串转换为小写,并将“部分字符串转为小写”替换为原始部分字符串,并在两侧添加两个下划线。

    【讨论】:

    • 太棒了,这正是我想要的!它在哪些方面不优雅,lambda函数中的r代表什么? (恐怕我对 lambda 了解不多)
    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2019-01-12
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多