Объединение числовой и логической индексации

#python #pandas

#питон #панды

Вопрос:

У меня есть следующий фрейм данных:

 import pandas as pd

df = pd.DataFrame(index=[0, 1, 2], columns=["test1", "test2"])
df.at[1, "test1"] = 3
df.at[2, "test2"] = 5

print(df)

    test1   test2
0   NaN     NaN
1   3       NaN
2   NaN     5
 

Я попробовал следующую строку, чтобы установить все значения NaN в индексах 1 и 2 на False :

 df.loc[[1, 2] amp; pd.isna(df)] = False
 

Однако это выдает мне ошибку.
Мой ожидаемый результат будет следующим:

     test1   test2
0   NaN     NaN
1   3       False
2   False   5
 

Комментарии:

1. Вы хотите использовать df.loc[[1,2]].fillna(False)

Ответ №1:

Ты можешь это сделать:

 In [917]: df.loc[1:2] = df.loc[1:2].fillna(False)

In [918]: df
Out[918]: 
   test1  test2
0    NaN    NaN
1      3  False
2  False      5
 

Комментарии:

1. Спасибо, именно то, что я искал!

Ответ №2:

pd.isna(df) это маска формы вашего фрейма данных, и вы не можете использовать ее как фрагмент в .loc вызове. В этом случае вы хотите выборочно обновлять нулевые значения вашего фрейма данных в определенных строках, чтобы мы могли использовать .fillna with update для возврата изменений.

 df.update(df.loc[[1, 2]].fillna(False))
print(df)

   test1  test2
0    NaN    NaN
1      3  False
2  False      5
 

Комментарии:

1. Интересный способ обновления, а также, спасибо за предложение

Ответ №3:

Давайте попробуем с fillna и пройдем dict

 df = df.T.fillna(dict.fromkeys(df.index[1:],False),axis=0).T
   test1  test2
0    NaN    NaN
1      3  False
2  False      5