用矢量化函数替换慢速 Pandas 循环

我在 pandas 中有一个循环,速度非常慢(十多分钟)。我试图用矢量化函数替换它,但不知道该使用什么。有多个记录具有不同的家庭号码但具有相同的关系组号码,如果记录的家庭号码与关系组号码相同,那么我想将该记录的官员号码和姓名用于具有该关系组的所有记录号码(包括家庭号码不同的情况)。参见下面的代码:


        rg['RG Officer Number'] = pd.np.nan

        rg['RG Officer Name'] = pd.np.nan

        for index, row in rg.iterrows():

            if row['Relationship Group'] == row['Household Number']:

                mask = rg['Relationship Group'] == row['Relationship Group']

                rg.loc[mask, 'RG Officer Number'] = row['Household Primary Officer Number']

                rg.loc[mask, 'RG Officer Name'] = row['Household Primary Officer Name'] 

我尝试了以下操作,但出现错误(无法使用单个 bool 来索引 setitem)。我想我完全偏离了轨道。也许这对于向量化函数来说是不可能的,但似乎不应该如此。


        mask = row['Relationship Group'] == row['Household Number']

        rg.loc[mask, 'RG Officer Number'] = rg.loc['Household Primary Officer Number']

您提供的任何帮助将不胜感激。


蛊毒传说
浏览 57回答 1
1回答

白猪掌柜的

过滤和合并就可以了。df = pd.DataFrame({'Household Number':[str(i) for i in range(10)],                   'Relationship Number':[str(i) for i in range(5)]*2,                   'RG Officer Number':np.random.randint(1,100,10),                   'RG Officer Name':['name'+str(i) for i in np.random.randint(1,100,10)]})df#  Household Number Relationship Number  RG Officer Number RG Officer Name#0                0                   0                 28          name87#1                1                   1                 18          name71#2                2                   2                 69           name8#3                3                   3                 83          name64#4                4                   4                 88          name36#5                5                   0                 25          name89#6                6                   1                 51          name76#7                7                   2                 29          name80#8                8                   3                 61          name27#9                9                   4                  2          name95df_filtered = df.loc[df['Household Number'] == df['Relationship Number']]df_filtered#  Household Number Relationship Number  RG Officer Number RG Officer Name#0                0                   0                 28          name87#1                1                   1                 18          name71#2                2                   2                 69           name8#3                3                   3                 83          name64#4                4                   4                 88          name36df_merged = pd.merge(left=df,right=df_filtered[['Relationship Number','RG Officer Number','RG Officer Name']],                     how='left',                     on='Relationship Number',suffixes=('_old','_new'))这是合并的数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python