繁体   English   中英

检查数据框的值是否小于或大于某个特定值

[英]Checking a dataframe for values less or more than a certain value

我正在对数据集进行权重计算,并在某些点检查加权组与所需目标的接近程度(例如,18-24岁的男性现在占数据的10%,而以前是5%?)。

我已经将原始和“目标”数据帧都转换为相似的结构,并减去了它们以查看每个单元格的差异。 我想扫描结果数据帧,以查看是否没有组的加权分布与目标分布之间的绝对差大于0.0001(如果是,则停止迭代并返回完成的df)。 我可以通过循环评估每一列来做到这一点,但是有没有更好的方法一次评估几列呢?

我敢肯定,这里做的事情可能有更好的方法,因此欢迎提出任何建议。

def checkconvergence():
    totaldist = pd.DataFrame()
    for col in df[columns]:
        totaldist[col] = df.groupby(col)['Weight'].sum()/df['Weight'].sum()
    target = pd.DataFrame.from_dict(weightdict)
    comparison = target.subtract(totaldist, fill_value=0)
    check = 0
    for col in comparison[columns]:
        if (abs(comparison[col]) < 0.0001).all():
           check+=1
    if check == 4:
        return df
    else:
        iterate(df)

这是我的数据框的示例... totaldist df:

    GenderAge   race    income  region
1   0.037       0.148   0.109   0.179
2   0.050       0.109   0.149   0.211
3   0.091       0.049   0.224   0.375
4   0.080       0.018   0.160   0.235
5   0.079       0.676   0.235   
6   0.074               0.044   
7   0.079               0.080   
8   0.043           
9   0.064           
10  0.081           
11  0.083           
12  0.079           
13  0.077           
14  0.084           

和目标df:

    GenderAge   race    income  region
1   0.040       0.173   0.108   0.179
2   0.057       0.125   0.148   0.211
3   0.078       0.043   0.225   0.375
4   0.074       0.019   0.161   0.235
5   0.077       0.640   0.236   
6   0.075               0.043   
7   0.083               0.079   
8   0.039           
9   0.056           
10  0.078           
11  0.077           
12  0.081           
13  0.082           
14  0.103       

和我的比较df像这样:

    GenderAge   race    income  region
1   0.003       0.025   -0.001  0.000
2   0.007       0.016   0.000   0.000
3   -0.013     -0.006   0.001   0.000
4   -0.006      0.001   0.001   0.000
5   -0.002     -0.036   0.002   0.000
6   0.001               0.000   
7   0.004               -0.001  
8   -0.004          
9   -0.008          
10  -0.003          
11  -0.006          
12  0.002           
13  0.005           
14  0.019           

在此示例中,由于此示例中的比较df具有一些大于0.0001的值,因此我的脚本将继续进行迭代,直到不再是这种情况为止。

要实现差异,您可以执行以下操作:

In [995]: target = (df2 - df1).fillna(0)

要检查是否存在绝对差大于0.0001单元格,可以应用df.transform ,然后使用df.any()

In [1004]: ((target.transform(abs) > 0.0001).any()).any()
Out[1004]: True

第一个any()返回按列比较。 第二个any()返回所有列的结果。

In [1008]: df2 = (target.transform(abs) > 0.0001).any()

In [1009]: df2
Out[1009]: 
GenderAge     True
race          True
income        True
region       False
dtype: bool

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM