Учитывая следующие панды 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'])
Вы можете вызвать 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
, но я не собираюсь показывать те, что вы можете проверить документы
Вы можете использовать следующее:
df = df[df.index.isnull() == False]
Возможно, вам захочется сбросить индекс после
Используя 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
Index.dropna
/Index.notnull
требуют Pandas> = 0.20.0, я думаю (именно поэтому я не мог заставить его работать). Но в противном случаеpd.notnull(df.index)
должен работать.pandas
будет достаточно свежей