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