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
,在某些情况下舍入为不同的值(有关更多信息,请参阅)李>舍入