Как перебрать векторизованный оператор if / else по нескольким столбцам со списком, который можно изменить? - PullRequest
0 голосов
/ 12 мая 2018

Числа в ltlist относятся к номерам идентификаторов, которые могут изменяться. Можно ли выполнять перечисление по нескольким столбцам для элементов в ltlist, если предположить, что элементы в ltlist в этом примере не являются постоянными. Надеюсь использовать цикл вместо векторизации, если / еще, но не смог заставить его работать.

import pandas as pd, numpy as np

ltlist = [1, 2]
org = {'ID': [1, 3, 4, 5, 6, 7], 'ID2': [3, 4, 5, 6, 7, 2]}

ltlist_set = set(ltlist)
org['LT'] = np.where(org['ID'].isin(ltlist_set), org['ID'], 0)
I'll need to check the ID2 column and write the ID in, unless it already has an ID.

выход

ID  ID2 LT
1   3   1
3   4   0
4   5   0
5   6   0
6   7   0
7   2   2

Спасибо!

1 Ответ

0 голосов
/ 12 мая 2018

Поскольку вы используете 0 в качестве значения по умолчанию, вы можете передать его как or с фреймом данных.

import pandas as pd
import numpy as np

ltset = set([1, 2])
org = pd.DataFrame({'ID': [1, 3, 4, 5, 6, 7], 'ID2': [3, 4, 5, 6, 7, 2]})

org['LT'] = 0
for col in org.columns.drop('LT'):
    org['LT'] = np.where(org[col].isin(ltset), org[col], org['LT']|0)

org 
# returns:
   ID  ID2  LT
0   1    3   1
1   3    4   0
2   4    5   0
3   5    6   0
4   6    7   0
5   7    2   2

Это всегда будет сохранять значение самого правого столбца, значение которого равно ltlist. Если вы хотите сохранить крайний левый столбец со значением, вы можете просто перебрать столбцы в обратном порядке.

for col in org.columns.drop('LT')[::-1]:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...