Сопоставление значений внутри столбца pandas

Я использовал приведенный ниже код, чтобы сопоставить 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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
379
8

Ответы 8

Ты можешь сделать:

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

Хм, это намного быстрее, чем назначать через loc

user3483203 25.07.2018 22:48

@ user3483203 вы можете попробовать маску, должно быть быстрее :-) df.S.mask(df.S>1,0)

BENY 25.07.2018 23:29

Да, намного быстрее, мне нужно больше использовать mask: D

user3483203 25.07.2018 23:58

Выполните операцию векторизации 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

Другие вопросы по теме