Pandas 熊猫中的矢量化索引查找

Pandas 熊猫中的矢量化索引查找,pandas,numpy,vectorization,Pandas,Numpy,Vectorization,我在一个数据集中循环,试图找到索引中的值。如果该值不在(多级)索引中,则采用默认值: for i,row in df.iterrows(): if i in avg_days.index: df.at[i,'avg_days_to_n'] = round(avg_days.xs(i,axis=0)[1],0) else: df.at[i,'avg_days_to_n'] = round(avg_days.xs((i[0],i[1]),level (

我在一个数据集中循环,试图找到索引中的值。如果该值不在(多级)索引中,则采用默认值:

for i,row in df.iterrows():
    if i in avg_days.index:
        df.at[i,'avg_days_to_n'] = round(avg_days.xs(i,axis=0)[1],0)
    else:
        df.at[i,'avg_days_to_n'] = round(avg_days.xs((i[0],i[1]),level (0,1),drop_level=False).avg_days_between_n.mean(),0)

有没有办法将其矢量化

以下是avg_days数据框的外观:

                            avg_n
state   project_type    cat 
FL      R               Hur 33
CA      C               EE  43
                            id
state   project_type    cat 
FL      R               Hur abc-1
CA      C               EE  def-2
以下是df的外观:

                            avg_n
state   project_type    cat 
FL      R               Hur 33
CA      C               EE  43
                            id
state   project_type    cat 
FL      R               Hur abc-1
CA      C               EE  def-2
因此,对于df中的每一行,如果索引state-project\u type-cat在avg\u天内有一个索引匹配,我将返回avg\u n值


如果没有,我“向上移动”索引并获取state project type(而不是cat)值,因为我知道该值将返回第一部分中的某些内容,使用该函数可以轻松实现同时匹配所有3个索引,该函数在pandas中实现。为了维护在
df
中找到的所有索引,即使它们在
avg_days
中不存在,必须将
how
参数设置为
left

merged_df = pd.merge(df,avg_days,right_index=True,left_index=True,how='left')
第二部分比这更棘手。合并后,
merged\u df
dataframe的
avg\u n
值中会有没有任何值的索引,这些索引必须设置为前两个索引的
avg\u n
平均值

可以使用groupby函数计算平均值,然后通过检查
NaN
获得需要更正的列表索引

days_grouped = np.around(avg_days.groupby(['state','project_type']).mean())
nan_mask = ~np.isfinite(merged_df['avg_n'])
indexes2correct = [(s,p) for s,p,c in merged_df[nan_mask].index.values]
最后,包含
NaN
的行可以使用
days\u gruded
中的值进行更新:

merged_df.loc[nan_mask,'avg_n'] = days_grouped.loc[indexes2correct]['avg_n'].values 
注意:我将获得的结果与问题中显示的代码以及这种矢量化方法进行了比较,其中有一些差异需要考虑:

  • 在这里,只对平均值进行四舍五入,并且假定
    avg_days['avg_n']
    中的值已经是整数
  • 舍入是使用
    numpy.round
    完成的,而不是内置的
    舍入
    ,在某些情况下舍入为不同的值(有关更多信息,请参阅)
“有没有办法将其矢量化?”有。怎么用?“我不知道,你还没有给我任何数据,也没有给我任何可以使用的数据。”coldspeed。您是对的,现在使用dataframes将索引添加到您的dataframes将有助于lot@pythonic833标记在那里。对于平均天数,它是国家项目类型和cat。对于df来说,这是同样的事情