仅当值存在一次时应用命令

2024-09-27 07:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的代码,它屏蔽了等于10的值,然后是下一个最接近的值。但实际上,只有在以“_ans”结尾的列中出现一次10时,我才需要应用它。所以掩码应该只出现在列“a_ans”中,因为“b_ans”中有两个10。 欢迎任何意见。谢谢


df = pd.DataFrame(data={'a_ans':[0,1,1,10,11],
                        'a_num': [1,8,90,2,8],
                        'b_ans': [0,10,139,10,18],
                        'b_num': [15,43,90,14,87]}).astype(float)


out=[]

for i in ['a_', 'b_']:
    
    pairs = (df.loc[:,df.columns.str.startswith(i)]) # pair columns
    
    mask1 = pairs[i+'ans'] == 10 # mask values equal to 10 
    mask2 = pairs[i+'ans'].eq(pairs[i+'ans'].mask(mask1).max())# get the next highest value 
    pairs = pairs.mask(mask1, 1001).mask(mask2, 1002) # replacing values
    out.append(pairs)


Tags: columns代码df结尾maskoutnum意见
2条回答

您可以使用^{}获取每列中每行值的出现次数:

if pairs[i+'ans'].value_counts()[10] == 1:
    # apply mask logic

以下修改可能有用,但不清楚下一个最接近或最高的值是什么

df = pd.DataFrame(data={'a_ans':[0,1,1,10,11],
                        'a_num': [1,8,90,2,8],
                        'b_ans': [0,10,139,10,18],
                        'b_num': [15,43,90,14,87]}).astype(float)


out=[]

for i in ['a_', 'b_']:
    
    pairs = df.loc[:,df.columns.str.startswith(i+"ans")] # for only _ans columns
    if len(pairs[pairs[i+'ans'] == 10]) == 1: # for only one ten  

        mask1 = pairs[i+'ans'] == 10 # mask values equal to 10 
        mask2 = pairs[i+'ans'].eq(pairs[i+'ans'].mask(mask1).max()) 
        pairs = pairs.mask(mask1, 1001).mask(mask2, 1002)
        out.append(pairs)

相关问题 更多 >

    热门问题