我有一个包含 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 通常会使事情变得非常快,但我无法实现它。
答案 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