Pandas dataframe задает значение столбца на основе вложенных условий if

63
6

У меня есть 4 столбца в dataframe и хотел бы изменить все значения в столбце 2 на основании нижеследующего условия:

if pd.isnull(df['COL2']) or df['COL2'] == "SOME_NAME":
if pd.isnull(df['COL3']) == False:
df['COL2'] = df['COL3']
else:
df['COL2'] = "DEFAULT"

так что в принципе, если col2 пуст или имеет какое-то конкретное имя, замените его на col3, если col3 не пуст, иначе замените по умолчанию

Я повторил по df, но совпадение не заменяет все значения. У меня есть несколько строк с значением col2, которое все еще установлено на "SOME_NAME". Есть ли простой способ сделать это?

спросил(а) 2021-01-25T21:18:57+03:00 4 месяца, 4 недели назад
1
Решение
63

Используйте назначение с loc, чтобы изменить только те строки, которые соответствуют вашему состоянию.

i = df['COL2'].isnull() | df['COL2'].eq('SOME_NAME')
j = df.loc[i, 'COL3']

df.loc[i, 'COL2'] = j.where(j.notnull(), 'DEFAULT')

ответил(а) 2021-01-25T21:18:57+03:00 4 месяца, 4 недели назад
45

Тернарный оператор был добавлен в 2.5, я считаю:

if (condition) else

sample dataframe:

df = pd.DataFrame({"COL2": ["first", None,"third","fourth", None], "COL3": ["first_","second_","third_","fourth_", None]})

поэтому вы можете сделать что-то подобное, чтобы заменить значение "третий" или null:

df['COL2'] =df.apply(lambda row: row['COL3'] if ((not row['COL2'] or row['COL2'] == "third") and row['COL3']) else "DEFAULT", axis=1)

Выход:

df
Out[21]:
COL2 COL3
0 DEFAULT first_
1 second_ second_
2 third_ third_
3 DEFAULT fourth_
4 DEFAULT None

ответил(а) 2021-01-25T21:18:57+03:00 4 месяца, 4 недели назад
45

Я думаю, вам нужно numpy.where с chanined условиями | для or и & для and:

mask = (df['COL2'].isnull() | (df['COL2'].str.strip() == "SOME_NAME")) & df['COL3'].notnull()

df['COL2'] = np.where(mask, df['COL3'], "DEFAULT")

Аналогичное решение:

df['COL2'] = df['COL3'].where(mask, "DEFAULT")

ответил(а) 2021-01-25T21:18:57+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема