Получить индекс значений NaN из выбранного набора строк - PullRequest
3 голосов
/ 08 июля 2019

У меня есть такой фрейм данных,

    ID   Cus_ID cl_id
0   5.0  200    0
1   NaN  200    0
2   NaN  200    1
3   14.0 200    2
4   15.0 200    2
5   16.0 200    2
6   NaN  200    3

Из приведенного выше фрейма данных я хочу извлечь строки с 0 по 4 и проверить, есть ли какие-либо значения в столбце 'ID', в котором есть NaNценности.Я попробовал это,

rows_needed = [0,1,2,3,4]

df.iloc[rows_needed,0].isnull().index.tolist()

Но я получаю следующее:

[0, 1, 2, 3, 4]

Я ожидаю получить индексы [1,2].Как я могу получить желаемый результат?

Когда я делаю это,

df.iloc[rows_needed,0].isnull()

Я получаю,

0    False
1     True
2     True
3    False
4    False
Name: ID, dtype: bool

Не уверен, где я делаю ошибку, чтобы не получить мой вывод.

Ответы [ 4 ]

3 голосов
/ 08 июля 2019

Давайте разберемся в цепочке loc выберет только результат, получится True out

rows_needed = [0,1,2,3,4]
df.iloc[rows_needed,0].isnull().loc[lambda x : x].index.tolist()
Out[240]: [1, 2]
3 голосов
/ 08 июля 2019

Два шага для ясности.Срез, затем маска на основе этого среза.


u = df.iloc[rows_needed, 0]

u[u.isnull()].index.tolist()

[1, 2]
3 голосов
/ 08 июля 2019

Вы очень очень близки, вам нужно соединить .iloc и .loc с ==TRUE, чтобы получить ваш результат

your_indices = (df.iloc[rows_needed]
                .loc[df.ID.isnull()==True]
                .index.tolist())

print(your_indices)
[1, 2]
0 голосов
/ 08 июля 2019

Вы можете использовать index.symmetric_different с dropna, чтобы найти эти индексы не NaN следующим образом:

df.iloc[rows_needed,0].dropna().index.symmetric_difference(rows_needed).tolist()

или

(df.iloc[rows_needed,0].dropna().index ^ rows_needed).tolist()

Out[684]: [1, 2]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...