python dataframe函数添加行名称_新的Dataframe列作为其他行(python)的通用函数

本文介绍了如何优化大型DataFrame的处理,包括使用并行化技术提高计算速度,以及通过分析相似度函数进行修剪,降低时间复杂度。给出了使用multiprocessing库并行处理DataFrame的示例代码,并探讨了依赖于功能的修剪策略。
摘要由CSDN通过智能技术生成

小编典典

让我们尝试分析一下问题:

如果有N行,则N*N在相似性函数中要考虑“对”。在一般情况下,对所有这些元素进行评估都是无可避免的(听起来很合理,但我无法证明这一点)。因此,您

至少具有O(n ^ 2)个时间复杂度 。

但是,您可以尝试使用时间复杂度 恒定的因素 。我发现的可能选项是:

1.并行化:

由于您有一些大型的DataFrame,并行处理是最佳的选择。这将使您(几乎)在时间复杂度方面得到线性改善,因此,如果您有16名工作人员,您将获得(几乎)16倍的改进。

例如,我们可以将的行划分df为不相交的部分,并分别处理每个部分,然后合并结果。一个非常基本的并行代码可能看起来像这样:

from multiprocessing import cpu_count,Pool

def work(part):

"""

Args:

part (DataFrame) : a part (collection of rows) of the whole DataFrame.

Returns:

DataFrame: the same part, with the desired property calculated and added as a new column

"""

# Note that we are using the original df (pandas_df) as a global variable

# But changes made in this function will not be global (a side effect of using multiprocessing).

for index, _id, word in part.itertuples(): # iterate over the "part" tuples

value = sum(

pandas_df[pandas_df['word'] != word].apply( # Calculate the desired function using the whole original df

lambda x: foo(x['word'], word),

axis=1

) < threshold

)

part.loc[index, 'bar'] = value

return part

# New code starts here ...

cores = cpu_count() #Number of CPU cores on your system

data_split = np.array_split(data, cores) # Split the DataFrame into parts

pool = Pool(cores) # Create a new thread pool

new_parts = pool.map(work , data_split) # apply the function `work` to each part, this will give you a list of the new parts

pool.close() # close the pool

pool.join()

new_df = pd.concat(new_parts) # Concatenate the new parts

注意:我试图使代码尽可能接近OP的代码。这只是一个基本的演示代码,并且存在许多更好的替代方法。

2.“低级”优化:

另一个解决方案是尝试优化相似度函数的计算和迭代/映射。与上一个或下一个选项相比,我认为这不会为您带来很大的提速。

3.取决于功能的修剪:

您可以尝试的最后一件事是依赖相似功能的改进。这在一般情况下不起作用,但如果您可以分析相似性函数,则将很好地工作。例如:

假设您使用的是Levenshtein距离(LD),则可以观察到任意两个字符串之间的距离> =长度之间的差。即LD(s1,s2) >=abs(len(s1)-len(s2))。

您可以使用此观察结果来修剪可能的相似对,以进行评估。因此,对于每个字符串长度l1,只有具有长度的字符串比较它l2有abs(l1-l2) <=

limit。(限制为所接受的最大相似度,在您提供的示例中为2)。

另一个观察是LD(s1,s2) = LD(s2,s1)。这样可以将对数减少2倍。

该解决方案实际上可能使您陷入O(n)时间复杂性(高度依赖于数据)的问题。

为什么?你可能会问。

这是因为,如果我们有10^9行,但平均而言10^3,每行只有“接近”长度的行,那么我们需要针对约10^9 * 10^3 /2对而不是10^9

* 10^9对来评估函数。但这(再次)取决于数据。如果(在此示例中)您拥有长度均为3的字符串,则此方法将无用。

2021-01-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值