如何为“非数字”列快速嵌套 for 循环?

问题描述 投票:0回答:1

如何对“非数字”列进行 pandas 快速嵌套 for 循环? 因为这个 for 循环太慢了:

for i in range(len(df1[column_A]):
    for j in range(len(df2[column_A]):
        if df1[column_A][i] == df2[column_A][j]:
            df1[column_B][i] = df2[column_B][j]
        else:
            pass

那么 pandas 本身或其他库还有其他方法可以做到这一点吗?

python pandas nested-loops
1个回答
0
投票

您提供的嵌套循环会导致 O(n^2) 复杂度,使得处理较大数据集时速度变慢。对 i 和 j 循环相同的范围,这是不必要的。 相反,您可以使用

pd.merge

import pandas as pd

# Merge file1 and file2 on column A
merged_df = pd.merge(file1, file2, on='column_A') # assuming it is a pandas dataframe 

# Update file1_column_B with matched values from file2
file1_column_B = merged_df['column_B_y']


pd.merge()
函数基于公共列 (column_A) 合并两个 DataFrame(file1 和 file2)。另外,默认情况下,
pd.merge()
执行内部合并,这意味着结果 DataFrame 中仅包含与 column_A 中的值匹配的行。

pd.merge
的时间复杂度在最佳情况下为O(n + m)(总结),其中n是左侧DataFrame(文件1)中的行数,m是右侧DataFrame(文件2)中的行数。 然而,在最坏的情况下(例如,当合并列中有许多重复值时),时间复杂度可能是 O(n × m)。

您还可以使用 numPy

argsort
+
searchsorted

import numpy as np


sorted_ = np.argsort(file2['column_A'])
match = np.searchsorted(file2['column_A'][sorted_], file1['column_A'])
 values from file2
file1_column_B = file2['column_B'][sorted_[match]]

默认情况下,其时间复杂度为 O(n log n) [最佳情况]。

© www.soinside.com 2019 - 2024. All rights reserved.