применяйте команду только в том случае, если значение существует один раз

#python #pandas

Вопрос:

У меня есть следующий код, который маскирует значения, равные десяти, а затем следующее ближайшее значение. Но на самом деле мне нужно применить его только в том случае, если 10 встречается один раз в столбце, заканчивающемся на «_ans». Таким образом, маска должна появляться только для столбца «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)

 

Ответ №1:

вы можете использовать value_counts() , чтобы получить вхождение каждого значения строки в каждом столбце:

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

Ответ №2:

Следующие изменения могут быть полезны, но неясно, какими должны быть следующие значения, самые близкие или самые высокие?

 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)