[英]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.