Я использовал приведенный ниже код, чтобы сопоставить 2 значения внутри столбца S с 0, но это не сработало. Любые предложения о том, как это решить? Примечание: я хочу реализовать внешнюю функцию внутри карты.
df = pd.DataFrame({
'Age': [30,40,50,60,70,80],
'Sex': ['F','M','M','F','M','F'],
'S' : [1,1,2,2,1,2]
})
def app(value):
for n in df['S']:
if n == 1:
return 1
if n == 2:
return 0
df["S"] = df.S.map(app)






Ты можешь сделать:
import numpy as np
df['S'] = np.where(df['S'] == 2, 0, df['S'])
Вы близки, но вам нужно внести некоторые исправления. Поскольку вы хотите использовать функцию, удалите петлю for и замените n на value. Кроме того, используйте apply вместо map. Apply работает сразу со всей колонкой. См. Этот отвечать, чтобы узнать, как правильно использовать apply, applymap и map.
def app(value):
if value == 1:
return 1
elif value == 2:
return 0
df['S'] = df.S.apply(app)
Age Sex S
0 30 F 1
1 40 M 1
2 50 M 0
3 60 F 0
4 70 M 1
5 80 F 0
Если вы хотите изменить только значения, равные 2, вы можете использовать pd.DataFrame.loc:
df.loc[df['S'] == 0, 'S'] = 0
Использование pd.Series.apply не рекомендуется, это просто неэффективный шлейф, завуалированный тонкой завесой.
Вы можете использовать .replace следующим образом: df ["S"] = df ["S"]. replace ([2], 0) Это заменит все 2 значения на 0 в одной строке
Не используйте apply, просто используйте loc для присвоения значений:
df.loc[df.S.eq(2), 'S'] = 0
Age Sex S
0 30 F 1
1 40 M 1
2 50 M 0
3 60 F 0
4 70 M 1
5 80 F 0
Если вам нужен более производительный вариант, используйте np.select. Это также более масштабируемо, так как вы всегда можете добавить больше условий:
df['S'] = np.select([df.S.eq(2)], [0], 1)
Используйте eq, чтобы создать логический ряд и преобразовать этот логический ряд в int с помощью astype:
df['S'] = df['S'].eq(1).astype(int)
ИЛИ ЖЕ
df['S'] = (df['S'] == 1).astype(int)
Выход:
Age Sex S
0 30 F 1
1 40 M 1
2 50 M 0
3 60 F 0
4 70 M 1
5 80 F 0
@ user3483203 вы можете попробовать маску, должно быть быстрее :-) df.S.mask(df.S>1,0)
Да, намного быстрее, мне нужно больше использовать mask: D
Выполните операцию векторизации numpy:
df['S'] = np.abs(df['S'] - 2)
и выделись из соревнований в интервью и ТАК ответах :)
>>>df = pd.DataFrame({'Age':[30,40,50,60,70,80],'Sex':
['F','M','M','F','M','F'],'S':
[1,1,2,2,1,2]})
>>> def app(value):
return 1 if value == 1 else 0
# or app = lambda value : 1 if value == 1 else 0
>>> df["S"] = df["S"].map(app)
>>> df
Age S Sex
Age S Sex
0 30 1 F
1 40 1 M
2 50 0 M
3 60 0 F
4 70 1 M
5 80 0 F
Хм, это намного быстрее, чем назначать через
loc