Как отфильтровать фрейм данных, уже содержащий NaN, на основе условий входа? - PullRequest
1 голос
/ 14 июля 2020

Я начинаю с одного фрейма данных и хочу разделить его на три фрейма данных в зависимости от условий, установленных для значений ввода. Для df1 я хотел бы иметь только значения Person_X <0,33. Для df2 я бы хотел иметь только 0,34 0,66. Я хотел бы, чтобы NaN заменял целочисленные значения, которые не соответствуют требованиям. </p>

Итак, начиная с df:

In [1]: df=pd.DataFrame({'location':[4991, 8870, 2703, 9674], 
   ...:                  'Person_1': ['NaN', 0.2,0.5,0.7], 
   ...:                  'Person_2':[0.8, 0.45, 'NaN', 0.1]}) 
   ...: df                                                                      
Out[1]: 
   location Person_1 Person_2
0      4991      NaN      0.8
1      8870      0.2     0.45
2      2703      0.5      NaN
3      9674      0.7      0.1

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

 df1
   location Person_1 Person_2
0      4991      NaN      NaN
1      8870      0.2     NaN
2      2703      NaN     NaN
3      9674      NaN      0.1

df2
 Out[4]: 
   location Person_1 Person_2
0      4991      NaN      NaN
1      8870      NaN     0.45
2      2703      0.5      NaN
3      9674      NaN      NaN

df3
 Out[4]: 
   location Person_1 Person_2
0      4991      NaN      0.8
1      8870      NaN      NaN
2      2703      NaN      NaN
3      9674      0.7      NaN

Я пробовал что-то подобное для каждого из требований, но поскольку df уже содержит NaN, у меня возникают проблемы.

patient_cols=[col for col in df if col.startswith('Person')]
df[patient_cols]=df[patient_cols].applymap(lambda x: np.nan if x>0.33 else x)
df[patient_cols]

1 Ответ

3 голосов
/ 14 июля 2020

Давайте использовать pd.DataFrame.where:

df=pd.DataFrame({'location':[4991, 8870, 2703, 9674], 
   'Person_1': [np.nan, 0.2,0.5,0.7], 
                     'Person_2':[0.8, 0.45, np.nan, 0.1]})  

#Just incase your NaN are strings as indicated by your original posts.
df=df.replace('NaN', np.nan) 

df= df.set_index('location')

df1 = df.where(df<.33).reset_index()
df2 = df.where((df>.34) & (df<.65)).reset_index()
df3 = df.where(df>.66).reset_index()

print(df1)
print('\n')
print(df2)
print('\n')
print(df3)

Вывод:

   location  Person_1  Person_2
0      4991       NaN       NaN
1      8870       0.2       NaN
2      2703       NaN       NaN
3      9674       NaN       0.1

   location  Person_1  Person_2
0      4991       NaN       NaN
1      8870       NaN      0.45
2      2703       0.5       NaN
3      9674       NaN       NaN

   location  Person_1  Person_2
0      4991       NaN       0.8
1      8870       NaN       NaN
2      2703       NaN       NaN
3      9674       0.7       NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...