【问题标题】:Operate on columns based on other column contents in pandas根据pandas中的其他列内容对列进行操作
【发布时间】:2023-03-28 20:06:01
【问题描述】:

来自 R,我无法弄清楚如何通过利用其他列对一个数据框列进行某种矢量化操作,例如:

import pandas as pd
df = pd.DataFrame({'s':['Big bear eats cat','cute cat sleeps'],'a':['bear','cat']})

现在我只想用 ANIMAL 逐行替换(可以拆分其他操作) a in s 的出现,所以它看起来像这样:

0    Big ANIMAL eats cat
1    cute ANIMAL sleeps

在 R data.table(带有矢量化函数)中,我会写类似

df[,s:=str_replace(s,a,"ANIMAL")]

我看到我可能可以使用 apply,但对于这样一个简单的案例来说,这似乎仍然非常复杂

【问题讨论】:

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


    【解决方案1】:

    您可以使用列表推导:

    df['s'] = [' '.join([i if i!=a else 'ANIMAL' for i in s.split()]) \
               for a, s in zip(df['a'], df['s'])]
    
    print(df)
    
          a                    s
    0  bear  Big ANIMAL eats cat
    1   cat   cute ANIMAL sleeps
    

    【讨论】:

    • 这可行,但对我来说似乎是一个非常复杂、非通用的解决方案
    • 我同意这不是“Pandorable”——另一方面,Pandas str 函数的速度非常慢。您已经通过np.vectorize 提出了一个不错的解决方案。
    【解决方案2】:

    我发现以下解决方案与我在 R 中使用的方法相同,方法是对 str.replace 进行矢量化(需要 numpy):

    import numpy as np
    
    df['s']=np.vectorize(str.replace)(df['s'],df['a'],"ANIMAL")
    
    print(df)
          a                    s
    0  bear  Big ANIMAL eats cat
    1   cat   cute ANIMAL sleeps
    

    【讨论】:

    • 不错的解决方案,比对大型数据帧的列表理解快约 2.5 倍。
    • 唯一的问题是它没有按单词分割。所以catheter 会被(不恰当地)抓住。这可能是性能差异的根源。
    • 是的,这是真的——我做了更多的实验,在这种情况下,我将只使用re.sub 而不是允许正则表达式的str.replace。我不确定性能,因为无法提前编译模式(因为它们取决于列内容),但性能还不是问题。
    猜你喜欢
    • 2019-11-04
    • 1970-01-01
    • 2021-03-09
    • 2016-10-23
    • 2021-06-07
    • 2021-03-19
    • 2021-11-19
    • 2018-11-09
    • 1970-01-01
    相关资源
    最近更新 更多