Как выбрать NaN строк и назначить значение_A для нового столбца? код df.loc ['condition_1' & 'condition_2' & 'df.column_a ==' '] =' value_a ' - PullRequest
1 голос
/ 23 апреля 2019

У меня есть данные, аналогичные приведенным ниже:

   A    B    C
0  M    M    M
1  Y    M    M
2  Y  NaN  NaN
3  Y    Y  etc

что мне нужно:

   A    B    C  F
0  M    M    M  3
1  Y    M    M  4
2  Y  NaN  NaN  0
3  Y    Y  etc  5

Я не знаю, как обращаться со строками [2, 3],здесь я перечисляю код, который я использовал, но не работал ниже:

df.loc[df['A'] == 'M', 'F'] = '3'
df.loc[((df.A != 'M') & (df.B == 'M')), 'F'] = '4'
df.loc[(df.A != 'M') & (df.B != 'M') & (df.C != ''), 'F'] = '5'
df.loc[(df.A != 'M') & (df.B != 'M') & (df.C == ''), 'F'] = '0'

Мне нужна помощь, спасибо!или покажи мне, где можно найти ответ?

1 Ответ

3 голосов
/ 23 апреля 2019

Использование numpy.select с Series.notna:

m1 = df['A'] == 'M'
m2 = df['B'] == 'M'
m3 = df['C'].notna()

df['F'] = np.select([m1, m2, m3], ['3','4','5'], default='0')
print (df)
   A    B    C  F
0  M    M    M  3
1  Y    M    M  4
2  Y  NaN  NaN  0
3  Y    Y  etc  5

Если необходимо, добавьте больше условий, используйте ~ для инвертирования маски и цепочки по bitwise AND - &:

m1 = df['A'] == 'M'
m2 = df['B'] == 'M'
m3 = df['C'].notna()
m11 = ~m1
m22 = ~m2
m33 = ~m3

df['F'] = np.select([m1, m2 & m11, m3 & m11 & m22], ['3','4','5'], default='0')

EDIT:

Ваше решение возможно изменить на Series.isna и Series.notna

df.loc[df['A'] == 'M', 'F'] = '3'
df.loc[((df.A != 'M') & (df.B == 'M')), 'F'] = '4'
df.loc[(df.A != 'M') & (df.B != 'M') & (df.C.notna()), 'F'] = '5' 
df.loc[(df.A != 'M') & (df.B != 'M') & (df.C.isna()), 'F'] = '0'
...