Если функция: если столбец A == 1 И 1 столбец B находится в списке X, а столбец C не равен нулю, 1. иначе 0 - PullRequest
1 голос
/ 29 октября 2019

У меня есть набор данных, который выглядит примерно так:

index  Ind.  Code Code_2
    1     1   NaN      x
    2     0     7    NaN
    3     1     9      z
    4     1   NaN      a
    5     0    11    NaN
    6     1     4    NaN

Я также создал список для указания значений в столбце Код, что-то вроде этого:

Code_List=['7', '9', '11']

Я быхотел бы создать новый столбец для индикатора, который равен 1, при условии, что Ind. = 1, код находится в приведенном выше списке, а код 2 не является нулевым

Я хотел бы создать функцию, содержащую оператор if,Я пробовал это, и я не уверен, что это проблема синтаксиса, но я продолжаю получать ошибки атрибута, такие как:

def New_Indicator(x):
    if x['Ind.'] == 1 and (x['Code'].isin[Code_List]) or (x['Code_2'].notnull()):
        return 1
    else: 
        return 0

df['NewIndColumn'] = df.apply(lambda x: New_Indicator(x), axis=1)

("'str' объект не имеет атрибута" isin '",' произошло в индексе 259 ') ("' float 'объект не имеет атрибута * notnull' "," произошло в индексе 259 ')

1 Ответ

0 голосов
/ 29 октября 2019

Проблема в том, что в вашей функции x['Code'] - это строка, а не серия. Я предлагаю вам использовать numpy.where :

ind1 = df['Ind.'].eq(1)

codes = df.Code.isin(code_list)

code2NotNull = df.Code_2.notnull()

mask = ind1 & codes & code2NotNull

df['indicator'] = np.where(mask, 1, 0)

print(df)

Выход

   index  Ind.  Code Code_2  indicator
0      1     1   NaN      x          0
1      2     0   7.0    NaN          0
2      3     1   9.0      z          1
3      4     1   NaN      a          0
4      5     0  11.0    NaN          0
5      6     1   4.0    NaN          0

Обновление (как предложено@ splash58):

df['indicator'] = mask.astype(int) 
...