如何选择NaN行并将value_A分配给新列?代码df.loc ['condition_1'&'condition_2'&'df.column_a ==''] ='value_a'

问题描述 投票:1回答:1

我有类似的数据如下:

   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'

我需要帮助,谢谢!或告诉我哪里可以找到答案?

python pandas nan loc
1个回答
3
投票

使用numpy.selectSeries.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')

编辑:

您的解决方案可能由Series.isnaSeries.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'
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.