python - 加速 Pandas DB 中的交叉引用过滤

标签 python performance pandas

我正在处理一个非常大的捐赠数据数据库,其中包含捐赠 ID、管道 ID、金额的相关列,例如:

  TRANSACTION_ID BACK_REFERENCE_TRAN_ID_NUMBER  CONTRIBUTION_AMOUNT
0    VR0P4H2SEZ1                             0                  100
1    VR0P4H3X770                             0                 2700
2    VR0P4GY6QV1                             0                  500
3    VR0P4H3X720                             0                 1700
4    VR0P4GYHHA0                  VR0P4GYHHA0E                  200

我需要做的是识别 TRANSACTION_ID 对应于任何 BACK_REFERENCE_TRAN_ID_NUMBER 的所有行。我目前的代码,尽管有点笨拙,是:

is_from_conduit = df[df.BACK_REFERENCE_TRAN_ID_NUMBER != "0"].BACK_REFERENCE_TRAN_ID_NUMBER.tolist()
df['CONDUIT_FOR_OTHER_DONATION'] = 0
for row in df.index:
    if df['TRANSACTION_ID'][row] in is_from_conduit:
        df['CONDUIT_FOR_OTHER_DONATION'][row] = 1
    else:
        df['CONDUIT_FOR_OTHER_DONATION'][row] = 0

但是,在具有大量管道捐赠的非常大的数据集上,这需要很长时间。我知道一定有更简单的方法,但显然我无法想出如何表达这个来找出它可能是什么。

最佳答案

您可以使用 Series.isin .它是一种矢量化操作,用于检查系列的每个元素是否在提供的可迭代对象中。

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique())

如@root 所述,如果您更喜欢 0/1(如您的示例)而不是 True/False,你可以转换为int:

df['CONDUIT_FOR_OTHER_DONATION'] = df['TRANSACTION_ID'].isin(df['BACK_REFERENCE_TRAN_ID_NUMBER'].unique()).astype(int)

关于python - 加速 Pandas DB 中的交叉引用过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38532244/

相关文章:

python - 在 python 中,在相同别名下导入新模块是否允许垃圾收集器拾取先前分配的模块?

python - 切片不一致 [ :] behavior on Pandas Dataframes

c++ - 在 C++ 程序中使用 _asm 代码是否有所不同

python - Pandas 读取多个带有模式名称的 Excel 工作表

python - 设置字符串而系列是 bool 值?

python - MongoDB - 计数已弃用

python - 如何取消连接 pandas 数据框?

performance - 组装一些与 nasm 宏不相符的代码

asp.net - C# (ASP.net) 中 RSS 提要的最佳实现

python - Pandas 中 Dataframe 的多列分组和求和