我有一个pandas数据帧,我想根据calc_value
列的值计算百分位,除非calc_value
为null,在这种情况下,percentile
也应该为null。在
我用scipy的rankdata来计算百分位,因为它handles repeated values better than pandas's qcut。在
然而,rankdata有一个缺陷,那就是它很乐意包含空值,而且似乎没有排除它们的选项。在
df = pd.DataFrame({'calc_value': [0, 0.081928, 0.94444, None, None]})
df['rank_val'] = rankdata(df.calc_value.values, method='min')
df.rank_val = df.rank_val - 1
df['percentile'] = (df.rank_val / float(len(df)-1)) * 100
这会产生明显错误的结果:
^{pr2}$我可以通过对数据帧切片并对切片执行相同的计算来计算所有非空值的百分位数:
df_without_nan = df[df.calc_value.notnull()]
但我不知道如何将这些值作为df['percentile']
推回到主数据帧中,在calc_value
也为null的任何行上,将percentile
和{
有人能给我建议吗?我在寻找以下结果:
calc_value rank_val percentile
0 0.000000 0 0
1 0.081928 1 25
2 0.944440 2 50
3 NaN NaN NaN
4 NaN NaN NaN
使用
pd.merge
:(这将给出一个setingwithcopywarning;如果这是一个问题,您可以对两个数据帧执行
^{pr2}$reset_index
,并使用生成名为index
的列:pd.merge(df, df_nonan, on='index', how='left')
,并在合并后删除index
列。)此时合并的数据帧是然后对冗余列进行一点清理:
结束
相关问题 更多 >
编程相关推荐