为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蛊毒传说 2023-10-26 15:27:13
我在 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']您提供的任何帮助将不胜感激。
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

过滤和合并就可以了。


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          name95



df_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          name36


df_merged = pd.merge(left=df,right=df_filtered[['Relationship Number','RG Officer Number','RG Officer Name']],

                     how='left',

                     on='Relationship Number',suffixes=('_old','_new'))

这是合并的数据。

https://img1.sycdn.imooc.com/653a15580001d01111440453.jpg

查看完整回答
反对 回复 2023-10-26
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信