Панды: отбросить строки с наноструктурным индексом

1

Учитывая следующие панды DataFrame, где некоторые индексы являются NaN, как удалить третью и восьмую строки, так как их индекс равен NaN? Спасибо

import pandas as pd
import numpy  as np

data    = list('abcdefghil')
indices = [0, 1, np.nan, 3, 4, 5, 6, np.nan, 8, 9]

df = pd.DataFrame(data, index=indices, columns=['data'])
Теги:
pandas
numpy

3 ответа

4
Лучший ответ

Вы можете вызвать dropna по индексу:

In[68]:
df.loc[df.index.dropna()]

Out[68]: 
    data
0.0    a
1.0    b
3.0    d
4.0    e
5.0    f
6.0    g
8.0    i
9.0    l

Обратите внимание, что наличие NaN делает индекс dtype float, чтобы изменить его на int cast type:

In[70]:
df = df.loc[df.index.dropna()]
df.index = df.index.astype(int)
df

Out[70]: 
  data
0    a
1    b
3    d
4    e
5    f
6    g
8    i
9    l

Вы также можете вызвать notnull по индексу, также будет работать (как-то недокументированным)

In[71]:
df = df.loc[df.index.notnull()]
df.index = df.index.astype(int)
df

Out[71]: 
  data
0    a
1    b
3    d
4    e
5    f
6    g
8    i
9    l

есть также isna:

In[78]:
df.loc[~df.index.isna()]

Out[78]: 
    data
0.0    a
1.0    b
3.0    d
4.0    e
5.0    f
6.0    g
8.0    i
9.0    l

и более читаемая обратная notna:

In[79]:
df.loc[df.index.notna()]

Out[79]: 
    data
0.0    a
1.0    b
3.0    d
4.0    e
5.0    f
6.0    g
8.0    i
9.0    l

Как прокомментировал @jpp, вы также можете использовать верхний уровень notnull:

In[80]:
df.loc[pd.notnull(df.index)]

Out[80]: 
    data
0.0    a
1.0    b
3.0    d
4.0    e
5.0    f
6.0    g
8.0    i
9.0    l

Существует также верхний уровень isna, notna и isnull, но я не собираюсь показывать те, что вы можете проверить документы

  • 0
    Index.dropna / Index.notnull требуют Pandas> = 0.20.0, я думаю (именно поэтому я не мог заставить его работать). Но в противном случае pd.notnull(df.index) должен работать.
  • 0
    @jpp правда, но я предполагаю, что версия для pandas будет достаточно свежей
Показать ещё 3 комментария
2

Вы можете использовать следующее:

 df = df[df.index.isnull() == False]

Возможно, вам захочется сбросить индекс после

1

Используя np.isnan и принимая отрицательный результат:

res = df[~np.isnan(df.index)]

print(res)

    data
0.0    a
1.0    b
3.0    d
4.0    e
5.0    f
6.0    g
8.0    i
9.0    l

Ещё вопросы

Сообщество Overcoder
Наверх
Меню