pandas:在数据帧的子集上创建列,在其他行上设置null?

2024-06-28 20:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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和{}设置为null。在

有人能给我建议吗?我在寻找以下结果:

   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

Tags: 数据nonepandasdfvalue切片calcval
1条回答
网友
1楼 · 发布于 2024-06-28 20:01:46

使用pd.merge

df_nonan = df[df['calc_value'].notnull()]
df_nonan['rank_val'] = stats.rankdata(df_nonan.calc_value.values, method='min')
df_nonan['rank_val'] = df_nonan['rank_val'] - 1
df_nonan['percentile'] = (df_nonan.rank_val / float(len(df)-1)) * 100

df_merge = pd.merge(df, df_nonan, left_index=True, right_index=True, how='left')

(这将给出一个setingwithcopywarning;如果这是一个问题,您可以对两个数据帧执行reset_index,并使用生成名为index的列:pd.merge(df, df_nonan, on='index', how='left'),并在合并后删除index列。)此时合并的数据帧是

^{pr2}$

然后对冗余列进行一点清理:

del df_merge['calc_value_x']
df_merge = df_merge.rename(columns = {'calc_value_y' : 'calc_value'})

结束

    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

相关问题 更多 >