【发布时间】:2021-06-23 15:19:05
【问题描述】:
我想使用返回 tuple 的函数向 pandas Dataframe 添加两列:
data=pd.DataFrame({'a':[1,2,3,4,5,6],'b':['ssdfsdf','bbbbbb','cccccccccccc','ddd','eeeeee','ffffff']})
def givetup(string):
result1 = string[0:3]
# please imagine here a bunch of string functions concatenated.
# including nlp methods with SpaCy
result2 = result1.upper()
# the same here, imagine a bunch of steps to calculate result2 based on result 1
return (result1,result2)
data['c'] = data['b'].apply(lambda x: givetup(x)[0])
data['d'] = data['b'].apply(lambda x: givetup(x)[1])
这是非常低效的(我正在处理数百万行),因为我调用了两次相同的函数并进行了两次计算。
由于result2 依赖于result 1 我最好不要将givetup 分成两个函数
如何只调用一次函数就将 result1 和 result2 一次性分配到新列 c 和 d 中?
最有效的方法是什么?
请记住,result1 和 result2 是非常耗时的字符串计算。
编辑 1: 我知道这件事: Apply pandas function to column to create multiple new columns?
即应用矢量化函数。在我的特殊情况下,这是非常不可取的,甚至是不可能的。想象一下,结果 1 和结果 2 是根据语言模型计算出来的,我需要纯文本。
【问题讨论】:
-
result2 取决于结果 1 是否可以编写两个(矢量化)函数,一个获取
result1,一个分别获取result2。那你可以data['c'] = func1(data['b']); data['d'] = func2(data['c'])? -
跟进@QuangHoang 所说的话。我像这样矢量化
data.assign(c=lambda d: d.b.str[0:3], d=lambda d: d.c.str.upper())
标签: python pandas performance apply assign