как изменить столбец фрейма данных с разными значениями и различными условиями в python?

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

У меня есть фрейм данных, в котором я хочу изменить столбец «conf» с разными значениями в соответствии с выполненным условием.

 df=pd.DataFrame({"conf":[100,100,100,100],
            "i":[-2,3,-3,10],
            "o":[12,13,14,16],
            "n":[6,4,6,1],
           "id":[1.4,2,1.3,1.7],
            "od":[2,3,2.5,8],
            "nd":[2,3,2.4,-0.9],
           "iwr":[60,60,45,65],
           "owr":[65,88,90,78],
           "nwr":[67,63,60,60]})
df  
  

я хочу это сделать, но я делаю это неправильно, потому что я передаю ряд в условие if, что неверно.

 def column_alter(df):
    if (((df["id"]>1.5) amp; (df["iwr"]>1.5)):
        if (((df["od"]>1.5) amp; (df["nd"]>1.5)) amp; ((df["owr"]>60) amp; (df["nwr"]>60))):
                df["conf"]= df["conf"]
        else:
            df["conf"]= df["conf"]*0.5
    else:
        if (((df["od"]>1.5) amp; (df["nd"]>1.5)) amp; ((df["owr"]>60) amp;(df["nwr"]>60))):
            df["conf"]= df["conf"]
        else:
            df["conf"]= df["conf"]*0.25
    return df  
  

Требуемый вывод: я хочу вернуть весь фрейм данных с измененным значением Conf, т.е. [100,100,25,50]

Комментарии:

1. я отредактировал вопрос, по которому он не должен передавать фрейм данных… теперь он передает логические значения. Не могли бы вы, пожалуйста, взглянуть на это еще раз @jezrael

2. Я понял. Сначала я не нахожу последнюю строку — ожидаемый результат.

Ответ №1:

Для else возможно инвертировать маску по ~ , цепную маску по amp; и несколько с DataFrame.loc :

 m0 = (df["id"]>1.5) amp; (df["iwr"]>1.5)
m1 = (df["od"]>1.5) amp; (df["nd"]>1.5) amp; (df["owr"]>60) amp; (df["nwr"]>60)

df.loc[m0 amp; ~m1, "conf"] *= 0.5
df.loc[~m0 amp; ~m1, "conf"] *= 0.25
print (df)
    conf   i   o  n   id   od   nd  iwr  owr  nwr
0  100.0  -2  12  6  1.4  2.0  2.0   60   65   67
1  100.0   3  13  4  2.0  3.0  3.0   60   88   63
2   25.0  -3  14  6  1.3  2.5  2.4   45   90   60
3   50.0  10  16  1  1.7  8.0 -0.9   65   78   60
  

Другое решение с numpy.select :

 m0 = (df["id"]>1.5) amp; (df["iwr"]>1.5)
m1 = (df["od"]>1.5) amp; (df["nd"]>1.5) amp; (df["owr"]>60) amp; (df["nwr"]>60)

df['conf'] *= np.select([m0 amp; ~m1, ~m0 amp; ~m1], [0.5, 0.25], default=1)
#long alternative
#df['conf'] = np.select([m0 amp; ~m1, ~m0 amp; ~m1], 
                        [df['conf'] * 0.5, df['conf'] * 0.25], default=df['conf'])
print (df)
    conf   i   o  n   id   od   nd  iwr  owr  nwr
0  100.0  -2  12  6  1.4  2.0  2.0   60   65   67
1  100.0   3  13  4  2.0  3.0  3.0   60   88   63
2   25.0  -3  14  6  1.3  2.5  2.4   45   90   60
3   50.0  10  16  1  1.7  8.0 -0.9   65   78   60