У меня есть dataframe панды с колонками A и BPython Панды - Капля строка на основе значения
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(10, 2)), columns=list('AB'))
я создаю столбец C, который является NULL, если A > B
df['C'] = np.select([ df.A > df.B ], [df.A], default=np.NaN)
Это дает:
A B C
0 95 19 95.0
1 46 11 46.0
2 96 86 96.0
3 22 61 NaN
4 69 1 69.0
5 78 91 NaN
6 42 7 42.0
7 24 28 NaN
8 55 92 NaN
9 92 16 92.0
Затем я бросаю строки, которые имеют df.C как NaN одним из нескольких способов:
df = df.dropna(subset=['C'], how='any')
или
df = df.drop(df[pd.isnull(df.C)].index)
или
df = df.drop(df[(pd.isnull(df.C))].index)
и все 3 метода дают мне примерно есть строки. В этом случае:
A B C
0 95 19 95.0
1 46 11 46.0
2 96 86 96.0
4 69 1 69.0
6 42 7 42.0
9 92 16 92.0
Но когда я не использую номер, например, строка:
df['C'] = np.select([ df.A > df.B ], ['yes'], default=np.NaN)
Тогда те же 3 методы уронить строки с df.C будучи NaN не фильтруются , Например, когда df.A > df.B
устанавливает столбец C в yes
, я получаю что-то вроде этого:
A B C
0 6 70 nan
1 85 46 yes
2 76 87 nan
3 77 36 yes
4 73 18 yes
5 1 41 nan
6 19 69 nan
7 62 89 nan
8 6 7 nan
9 35 75 nan
я могу это исправить, заменив pd.NaN со строкой, как «ИГНОРИРУЙТЕ», а затем фильтрации «ИГНОРИРУЙТЕ», но Я нахожу этот результат иначе неожиданным.
df['C'] = np.select([ df.A > df.B ], ['yes'], default='IGNORE')
df = df.drop(df[(df.C == 'IGNORE')].index)
Что здесь происходит? (Когда df.C строка, мои pd.NaN существа преобразуются в строки?)
Я использую 64-битный Python 2.7.13, панды 0.19.2 и 1.11.3 Numpy на Windows 10.
@Psidom Да, правда. Кажется, NaN буквально «не число» и преобразуется в строку «nan». – philshem
@Psidom, если вы напишете свой комментарий в качестве ответа, я был бы рад принять его. На самом деле это не объясняет почему, но он определенно решает проблему. – philshem