优化熊猫中的嵌套循环

时间:2021-03-22 14:37:45

标签: python pandas

我有一个包含 2 列的数据框:“VENDOR_ID”和“GL_Transaction_Description”。我想打印 'GL_Transaction_Description' 列中具有来自 'VENDOR_ID' 列的任何值的每一行。

<头>
VENDOR_ID GL_Transaction_Description
123 你好 345
456 再见456
987 感谢 456

此处所需的输出是“BYE 456”和“THANKS 456”。 我的代码是这样的:

for k in range(len(df)):
    for j in range(len(df)):
        if df['VENDOR_ID'][k] in df['GL_Transaction_Description'][j] and df['VENDOR_ID'][k] != 'nan':
            print(df['GL_Transaction_Description'][j])

但是这个特定的数据帧计数超过 100k 行,并且使用嵌套的 for 循环需要永远运行。关于如何使执行速度更快的任何想法?我已经读到使用 numpy 通常会使事情变得非常快,但我无法实现它。

3 个答案:

答案 0 :(得分:1)

使用Boolean Mask

v_list = df['VENDOR_ID'].to_list()
mask = list(map((lambda x: any([(y in x) for y in v_list])), df['GL_Transaction_Description']))

print(df['GL_Transaction_Description'][mask])

假设 'VENDOR_ID' 已经在 str 的 dtype 中。如果不是,则将行 mask = .... 更改为:

mask = list(map((lambda x: any([(str(y) in x) for y in v_list])), df['GL_Transaction_Description']))

我们可以用 df.apply()axis=1 做到这一点。但是,list(map())better system performance(执行时间)比 df.apply() 上的 axis=1

输出:

1       BYE 456
2    THANKS 456
Name: GL_Transaction_Description, dtype: object

答案 1 :(得分:0)

您可以使用boolean Indexing

df.loc[df['GL_Transaction_Description'].isin(df['VENDOR_ID']), 'GL_Transaction_Description']

答案 2 :(得分:0)

您可以通过 isin 函数使用布尔索引

import pandas as pd
df = pd.DataFrame({'VENDOR_ID': list('abcde') + ['matching_item'],
                  'GL_Transaction_Description': ['trx_descr_' + c for c in list('abcde')] + ['matching_item']})
df

    VENDOR_ID       GL_Transaction_Description
0   a               trx_descr_a
1   b               trx_descr_b
2   c               trx_descr_c
3   d               trx_descr_d
4   e               trx_descr_e
5   matching_item   matching_item

df[df.GL_Transaction_Description.isin(df.VENDOR_ID)].GL_Transaction_Description

5    matching_item
Name: GL_Transaction_Description, dtype: object