检查数据帧的值是否小于或大于某个值

时间:2017-07-09 03:39:07

标签: python pandas dataframe

我正在迭代数据集上的权重计算并且在某些点检查加权组与期望目标的接近程度(例如,现在是男性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的值,我的脚本将继续迭代,直到不再是这种情况。

1 个答案:

答案 0 :(得分:0)

要做出改变,你可以这样做:

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