Как написать np. Где переменная равна any в списке, что-то сделать? - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь добавить в свой фрейм данных столбец, который вычисляет Delta. На основе имени в столбце «Имя», если это имя есть в списке, вычисляется df ['A'] - df ['B'], если имя отсутствует в списке, вычисляется df [' B '] - df [' A '].

Вот что у меня есть:

for i in list1:
    
     df['Delta'] = np.where(df['Name'] == i, np.maximum(0, df['A'] - df['B']), np.maximum(0, df['B'] - df['A']))

Проблема в том, что он проходит через каждый i отдельно и перезаписывает все i, которые были ранее .

Как я могу переписать этот код, чтобы он не go проходил через каждый i, а вместо этого просто проверял, равно ли df ['Name'] любому из i?

Что-то вроде:

df['Delta'] = np.where(df['Name'] == any(list1), np.maximum(0, df['A'] - df['B']), np.maximum(0, df['B'] - df['A']))

Если есть лучший способ сделать это, дайте мне знать.

1 Ответ

1 голос
/ 10 июля 2020

Используйте Series.isin, чтобы создать логическую маску , затем используйте np.where вместе с этой маской, чтобы выбрать значения из вариантов на основе этой маски:

diff = df['A'].sub(df['B'])
df['Delta'] = np.where(df['Name'].isin(list1), np.maximum(0, diff), np.maximum(0, -diff))

Пример:

np.random.seed(10)

list1 = ['a', 'c']
df = pd.DataFrame({'Name': np.random.choice(['a', 'b', 'c'], 5), 'A': np.random.randint(1, 10, 5), 'B': np.random.randint(1, 10, 5)})

diff = df['A'].sub(df['B'])
df['Delta'] = np.where(df['Name'].isin(list1), np.maximum(0, diff), np.maximum(0, -diff))

Результат:

# print(df)
  Name  A  B  Delta
0    b  1  7      6
1    b  2  5      3
2    a  9  4      5
3    a  1  1      0
4    b  9  5      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...