Возьмите n последних строк информационного кадра без NaN - PullRequest
1 голос
/ 15 апреля 2020

Давайте возьмем этот фрейм данных:

df = pd.DataFrame(dict(Col1 = [1,2,np.nan,4,5,6], Col2=[4,np.nan,5,np.nan,1,5]))

   Col1  Col2
0   1.0   4.0
1   2.0   NaN
2   NaN   5.0
3   4.0   NaN
4   5.0   1.0
5   6.0   5.0

Я бы хотел извлечь n последних строк df без NaN.
Не могли бы вы помочь мне получить этот ожидаемый результат?

   Col1  Col2
0     5     1
1     6     5

РЕДАКТИРОВАТЬ: скажем, я не знаю, где последний NaN

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Использовать DataFrame.dropna с DataFrame.tail и преобразовывать в целые числа:

N = 2
df1 = df.dropna().tail(N).astype(int)
#alternative
#df1 = df.dropna().iloc[-N:].astype(int)
print (df1)
   Col1  Col2
4     5     1
5     6     5

РЕДАКТИРОВАТЬ: Для последней группы без пропущенных значений сравните ошибочные значения с DataFrame.isna и DataFrame.any, затем порядок обмена с накопленной суммой, поэтому последняя группа имеет 0 значений в маске:

m = df.isna().any(axis=1).iloc[::-1].cumsum().eq(0).sort_index()
df1 = df[m].astype(int)
print (df1)
   Col1  Col2
4     5     1
5     6     5

Если строки нет сопоставить его вернуть правильный пустой DataFrame:

df = pd.DataFrame(dict(Col1 = [1,2,np.nan,4], Col2=[np.nan,np.nan,5,np.nan]))
print (df)
   Col1  Col2
0   1.0   NaN
1   2.0   NaN
2   NaN   5.0
3   4.0   NaN

m = df.isna().any(axis=1).iloc[::-1].cumsum().eq(0).sort_index()
df1 = df[m].astype(int)
print (df1)
Empty DataFrame
Columns: [Col1, Col2]
Index: []
1 голос
/ 15 апреля 2020

другой способ - использовать isna с drop_duplicates и cumsum, чтобы получить максимальный индекс, а затем просто использовать фильтрацию индекса

last_na = df.isna().cumsum(axis=0).drop_duplicates(keep='first').index.max() + 1


new_df = df.iloc[last_na:]

print(new_df)
Col1    Col2
4   5.0     1.0
5   6.0     5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...