#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