我在数据框中有一个值列。我想将值分类在一定范围内。例如:
range1 =(值在400-500之间)
range2 =(值在200-300之间)
range3 =(值范围从100-200)
我需要计算与每个范围相对应的值的增量计数,即范围计数及其对应的概率。为了详细说明,我在下面列出了一个示例。
注:在概率中。列,对于第5行,值255对应于range2,并且对于该对应范围,到目前为止看到的出现次数是1,并且到目前为止看到的总行数是5。因此,prob = 1/5 = 0.2。
类似地,在下一行中,我们看到对应于相同范围的值,因此我们将其范围计数增加到2,因此现在,prob = 2/6 = 0.33
[列计数范围和概率是我要计算的
假设您的样本在工作表中占据范围A1:C12,则可以在B2和C2中使用以下公式。这两个公式都可以复制到表格的末尾。
[B2] =MATCH(A2,{1000,500,400,300},-1)-1
[C2] =COUNTIF(B$2:B2,B2)/COUNT(B$2:B2)
如果计算的值大于1000,则MATCH函数将返回错误。对于任何300或更低的值,它将返回计数范围#3。如果需要将300包含在计数范围#2中,请将公式中的数组更改为{1000,499,399,299}。也可以使用小数,例如{1000,499.9,399.9,299.9}。
COUNTIF范围如B $ 2:B2会随着您的复制而扩展,从绝对的B $ 2(不会改变)到B3,B4,B5等,从而从B2列顶部到当前行,而忽略公式所在行下方的所有内容。
def state(x):
if x >=100 and x<=200:
return "Range3"
if x >=200 and x<=300:
return "Range2"
if x >=400 and x<=500:
return "Range1"
df['state'] = df['Value'].apply(lambda x: state(x))
df['Count_range'] = df.groupby('state').cumcount()+1
df['Prob'] =df['Count_range']/(df.index+1)
使用“值”列上的状态功能定义范围的类别,并使用pandas.groupby按状态对它们进行分组后,执行累积计数。最后,要获得概率列,请将Count_range列值除以相应的索引,分别获得平均值。