Я хочу заполнить столбец значениями True и NaN
import numpy as np
import pandas as pd
my_list = [1,2,3,4,5]
df = pd.DataFrame({'col1' : [0,1,2,3,4,5,6,7,8,9,10]})
df['col2'] = np.where(df['col1'].isin(my_list), True, np.NaN)
print (df)
Он печатает:
col1 col2
0 0 NaN
1 1 1.0
2 2 1.0
3 3 1.0
4 4 1.0
5 5 1.0
6 6 NaN
7 7 NaN
8 8 NaN
9 9 NaN
10 10 NaN
Но для меня очень важно вывести логическое значение True, а не число с плавающей запятой 1.0. Этот столбец взаимодействует с другими столбцами. Они логические, поэтому они тоже должны быть логическими. Я знаю, что могу изменить его с помощью функции замены. Но мой DataFrame очень большой. Я не могу терять время. Есть ли простой вариант сделать это?
Используйте тип данных Nullable Boolean:
df['col2'] = pd.Series(np.where(df['col1'].isin(my_list), True, np.NaN), dtype='boolean')
print (df)
col1 col2
0 0 <NA>
1 1 True
2 2 True
3 3 True
4 4 True
5 5 True
6 6 <NA>
7 7 <NA>
8 8 <NA>
9 9 <NA>
10 10 <NA>
@ИгорьК. - Нет incompetence
. Но разработчики панд хотели различать NaN
и nullable NaN
, поэтому использовали <NA>
Идеальный! Вы сделали мой день и сэкономили часы работы!!!!!!
ты можешь назвать это
df.col2 = df.col2.apply(lambda x: True if x==1.0 else x)
это не будет эффективным, как другой ответ в манере исполнения
Этот код решит вашу проблему. np.where вернет вам true, потому что numpy имеет дело только с числом, а True означает 1 в числе. вот почему он дает вам 1.0 вместо True
Код
import numpy as np
import pandas as pd
my_list = [1,2,3,4,5]
df = pd.DataFrame({'col1' : [0,1,2,3,4,5,6,7,8,9,10]})
df['col2'] = df['col1'].apply(lambda x: True if x in my_list else np.NaN)
print (df)
Полученные результаты
col1 col2
0 0 NaN
1 1 True
2 2 True
3 3 True
4 4 True
5 5 True
6 6 NaN
7 7 NaN
8 8 NaN
9 9 NaN
10 10 NaN
Простите мою некомпетентность! Но почему NaN здесь выглядит как <NA>?