pandas Python -第二个/最小值行方向的互补抑制

njthzxwz  于 2022-11-27  发布在  Python
关注(0)|答案(1)|浏览(119)

我正在python中编写一个数据抑制脚本,其中我需要1)抑制小值(1到5之间)和2)确保在最小的聚合级别上至少隐藏了2个值。将小值替换为-1(稍后我将把它重新编码为“s”)。我创建了一个新的helper列,它计算每行('sup_cnt')中隐藏的值的数量。这样就得到了如下结果:

Subgroup   cat1    cat2    cat3    sup_cnt
Group1      0      -1       0       1
Group2     -1      22       6       1
Group3     -1      14      -1       2
Group4     -1      -1       0       2

data = {'group':['group1','group2','group3','group4'],'cat1':[0,-1,-1,-1],'cat2':[-1,22,14,-1],'cat3':[0,0,-1,0],'sup_cnt':[1,1,2,3]}
df = pd.DataFrame(data)

因此,对于只隐藏了一个值的Group 1和Group 2,我希望用-1替换第二个值--最小值(包括零)。在Group 1中,将替换其中一个零;在Group 2中,6将被替换。因此结果将如下所示:

Subgroup   cat1    cat2    cat3    sup_cnt
Group1     -1      -1       0       1
Group2     -1      22      -1       1
Group3     -1      14      -1       2
Group4     -1      -1       0       2

如果有多个列具有相同的最小值(如Group 1,它有2个零),我只希望替换其中的一个(不管是哪个)。
最初在R中启动,然后切换到python/panda我的想法是编写一个函数,该函数将cat值作为参数,确定这些值中的最小非负整数,循环遍历一行中的数据列,并替换该行中该最小值的第一个示例,然后中断。虽然不确定这是否是正确的方法(或者确切地说如何执行它)。有什么想法吗?

1wnzp6jl

1wnzp6jl1#

我希望我没理解错你的问题:

def fn(x):
    cols = x.filter(regex=r"^cat")
    x = cols[cols >= 0].sort_values()[: 2 - x["sup_cnt"]]
    df.loc[x.name, x.index] = -1

df[df.sup_cnt < 2].apply(fn, axis=1)
print(df)

印刷品:

Subgroup  cat1  cat2  cat3  sup_cnt
0   Group1    -1    -1     0        1
1   Group2    -1    22    -1        1
2   Group3    -1    14    -1        2
3   Group4    -1    -1     0        2

相关问题