我在这里发现了这篇文章: Pandas: How to use apply function to multiple columns
我正在表演类似的事情。我有以下列:[' vol_a',' vol_b',' vol_c'](但还有更多),我写的是转换这些值的函数进入队伍。我有兴趣创建包含名称[' vol_rank_a',' vol_rank_b',' vol_rank_c']的新列,并将这些列分配给该函数的标准化排名值。
按照上述帖子的逻辑,我尝试做了类似的事情:
data[new_cols] = data.apply(apply_vol_ranking,axis=1)
其中apply_vol_ranking()
定义为:
def apply_vol_ranking(row):
vols = get_vols_from_row(row)
vols = get_normalized_vol(vols)
return vols
其中get_vols_from_row(row)
定义为:
def get_vols_from_row(row):
vol_cols = [col for col in row.index if col.startswith("vol_")]
values = []
for col in vol_cols: values.append(row[col])
return values
和get_normalized_vol()
as:
def get_normalized_vol(vol_list):
assert any(isinstance(vol_list,type_) for type_ in [list,np.ndarray])
d = len(vol_list)+1
ranked = scipy.stats.rankdata(vol_list)
if all(math.isnan(vol) for vol in vol_list):
ranked = [0 for vol in vol_list] # np.nan gets the last rank. Works here, but not in slopes.
else:
ranked = [rank/d for rank in ranked]
return ranked
我得到的KeyError不在索引中。我打赌这是因为我试图将多个值分配给多个列。 (哦和new_cols
只是一个类似[' vol_rank_a',' vol_rank_b',' vol_rank_c'])的列表。
因此,为了将所有内容都放在透视图中,每一行都有一些' vol _ *'列。我对所有这些感兴趣,我对它们进行排名并使它们正常化。对于同一行,我现在要将它们保存在' vol_rank _ *'
的名称下