pandas分位数赋值异常:DataFrame新增列全为NaN求原因
问题原因分析与解决方案
嘿,我来帮你拆解下这个问题~
核心原因
你写的代码dataframe['row'].quantile([.1,.5,.7])会返回一个只有3个元素的Series,它的索引是你指定的分位数数值(0.1、0.5、0.7),而你的原DataFrame有5759行,行索引是从0到5758的整数序列。
当Pandas执行列赋值操作时,它会严格按照索引匹配的规则填充数据:只有当原DataFrame的行索引和右侧Series的索引完全一致时,才会填入对应的分位数值;所有索引不匹配的行,都会被填充为NaN。因为你的原DataFrame索引和分位数Series的索引完全不重合,所以整列都变成了NaN。
针对不同需求的解决方案
需求1:标记每行数据所属的分位数区间
如果你想判断每行的row值落在哪个分位数区间里,并标记对应的分位阈值,可以用pd.qcut()函数:
import pandas as pd # 将row列按指定分位数切分,标记对应的分位值 dataframe['pc'] = pd.qcut(dataframe['row'], q=[0, 0.1, 0.5, 0.7, 1], labels=[0.1, 0.5, 0.7, 1])
这样每行的pc值会显示它所在区间的上限分位数,比如row值小于0.1分位数的,pc就是0.1;在0.1到0.5之间的,pc就是0.5,以此类推。
需求2:让pc列循环填充这三个分位数值
如果你只是想把这三个分位数重复填充到整个pc列,可以把分位数结果转成列表后,扩展到和DataFrame行数一致的长度:
import pandas as pd import numpy as np q_values = dataframe['row'].quantile([.1,.5,.7]).tolist() # 循环扩展列表到目标长度 dataframe['pc'] = np.tile(q_values, len(dataframe) // len(q_values) + 1)[:len(dataframe)]
内容的提问来源于stack exchange,提问作者Sentinan
相关产品推荐
相关产品推荐

