Python 加速pandadb中的交叉参考滤波

Python 加速pandadb中的交叉参考滤波,python,performance,pandas,Python,Performance,Pandas,我正在使用一个非常大的捐赠数据库,其中包含捐赠ID、管道ID、金额等相关列的数据,例如: TRANSACTION_ID BACK_REFERENCE_TRAN_ID_NUMBER CONTRIBUTION_AMOUNT 0 VR0P4H2SEZ1 0 100 1 VR0P4H3X770 0 2700 2

我正在使用一个非常大的捐赠数据库,其中包含捐赠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
我需要做的是识别事务ID对应于任何BACK\u REFERENCE\u TRAN\u ID\u编号的所有行。我目前的代码虽然有点笨拙,但是:

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
然而,在拥有大量管道捐赠的非常大的数据集上,这需要永远的时间。我知道一定有一种更简单的方法,但很明显我想不出如何表达这一点来找出可能是什么。

您可以使用。它是一种向量化操作,用于检查序列中的每个元素是否在提供的iterable中

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)

这里有一个基于NumPy的方法,使用-


我认为您应该添加一个
.astype(int)
,因为
isin
返回布尔值,并且示例代码似乎给出了0/1值。返回t/F或1/0之间没有任何长期差异,但这两种方式都很好,谢谢!在
df.iloc[4,1]
的末尾额外添加
'E'
有什么原因吗?我编辑了一点,以使复制/粘贴更容易。它不应该改变你写的东西。然而,我不明白你的意思。你能展示你的预期产出吗?在这里,您的专栏
conduct\u用于其他捐赠
只有
0
s4)VR0P4GYHHA0 VR0P4GYHHA0Enp.in1D()似乎提供了成员身份--如何获得位置或索引值。@Merlin我不确定我们是否需要成员身份或位置,因为它一次就获得了整个输出列,我们只是分配了一个新列,并将值
vals
放入现有数据框中。还是我错过了什么?这个函数提供了成员资格。我想知道你是否能得到位置或索引。文档>[0,2,0]是会员资格。但是元素的索引是什么呢。第二个“0”具有索引5。“我怎么能得到它呢?”梅林啊!假设我得到了你的问题,使用
np.where(np.inad(..)
?哦,如果你想对应哪个元素来自哪个元素,我们可以使用
np.searchsorted
。回到问题上来,我假设OP希望在输出列中获得OP发布的代码所建议的
0
1
。刚才选中的np.searchsorted将给出元素在排序的“列表”中的位置,而不是原始“列表”的索引
vals = np.in1d(df.TRANSACTION_ID,df.BACK_REFERENCE_TRAN_ID_NUMBER).astype(int)
df['CONDUIT_FOR_OTHER_DONATION'] = vals