У меня есть двухколоночный фрейм данных в форме:

    Death       HEALTH
0   other       0.0
1   other       1.0
2   vascular    0.0
3   other       0.0
4   other       0.0
5   vascular    0.0
6   NaN         0.0
7   NaN         0.0
8   NaN         0.0
9   vascular    1.0

Я хочу создать новый столбец, выполнив следующие действия:

  1. везде, где встречается значение «другое», напишите «Нет»
  2. где бы ни появился NaN, оставьте его как есть
  3. везде, где в первом столбце указано значение vascular, а во втором - 1.0, напишите "Yes".
  4. везде, где в первом столбце указано значение «сосудистая», а во втором - 0,0, напишите «Нет».

Результат должен быть:

    Death       HEAlTH       New
0   other       0.0          No
1   other       1.0          No
2   vascular    0.0          No
3   other       0.0          No
4   other       0.0          No
5   vascular    0.0          No
6   NaN         0.0          NaN
7   NaN         0.0          NaN
8   NaN         0.0          NaN
9   vascular    1.0          Yes

Есть ли питонический способ добиться этого? Я потерялся между циклами и условными выражениями.

1
Ernesto Lopez Fune 14 Янв 2021 в 12:22

2 ответа

Лучший ответ

Вы можете создать условия для No и Yes, а для всех остальных значений создается исходное значение в numpy.select:

m1 = df['Death'].eq('other') | (df['Death'].eq('vascular') & df['HEALTH'].eq(0))
m2 = (df['Death'].eq('vascular') & df['HEALTH'].eq(1))

df['new'] = np.select([m1, m2], ['No','Yes'], default=df['Death'])

Другая идея - проверить также отсутствующие значения, и если условия совпадения не установлены, исходные значения:

m1 = df['Death'].eq('other') | (df['Death'].eq('vascular') & df['HEALTH'].eq(0))
m2 = (df['Death'].eq('vascular') & df['HEALTH'].eq(1))
m3 = df['Death'].isna() 

df['new'] = np.select([m1, m2, m3], ['No','Yes', np.nan], default=df['Death'])

print (df)

print (df)
0  another val     0.0  another val
1        other     1.0           No
2     vascular     0.0           No
3        other     0.0           No
4        other     0.0           No
5     vascular     0.0           No
6          NaN     0.0          NaN
7          NaN     0.0          NaN
8          NaN     0.0          NaN
9     vascular     1.0          Yes
0
jezrael 14 Янв 2021 в 09:31

Простой способ сделать это - реализовать условную логику с использованием if / else внутри функции и apply этой функции построчно по отношению к фрейму данных.

def function(row):
    if row['Death']=='other':
        return 'No'
    if row['Death']=='vascular':
        if row['Health']==1:
            return 'Yes'
        elif row['Health']==0:
            return 'No'
    return np.nan
# axis = 1 to apply it row-wise
df['New'] = df.apply(function, axis=1)

При необходимости он производит следующий вывод:

      Death  Health  New
0     other       0   No
1     other       1   No
2  vascular       0   No
3     other       0   No
4     other       0   No
5  vascular       0   No
6       NaN       0  NaN
7       NaN       0  NaN
8       NaN       0  NaN
9  vascular       1  Yes
0
Akash Haridas 14 Янв 2021 в 09:50
65716315