У меня много кадров данных со следующей структурой.
TRCODEP 10101 10201 20101 20201 20203
43826 4:00:00 NaN NaN NaN NaN
43827 NaN NaN NaN NaN NaN
43828 NaN 20:00:00 NaN NaN NaN
43829 NaN NaN NaN 20:35:00 NaN
43830 20:45:00 NaN NaN NaN NaN
43829 NaN NaN 02:00:00 NaN NaN
Для каждого кадра данных я хотел бы создать новый фрейм данных, который выбирает строку с записью, отличной от NaN, в столбце 10101 и тремя предыдущими строками. У меня возникают проблемы, потому что у меня может быть несколько записей, отличных от NaN, для 10101, как вы можете видеть выше. И даже если учесть эту проблему, я, похоже, не могу df['10101'].notna().index[0]
с помощью df['10101'].notna().index[0]
и df['10101'].notna().index[0]-3
.
Какие у меня варианты?
Это не так сложно. Вы можете сделать это с помощью Series.last_valid_index
и некоторых Series.last_valid_index
:
# get index of last valid non-null value in 10101
idx = df.index.get_loc(df['10101'].last_valid_index())
# slice rows (with some minor bounds checking)
df.iloc[max(0, idx - 3):idx + 1]
TRCODEP 10101 10201 20101 20201 20203
1 43827 NaN NaN NaN NaN NaN
2 43828 NaN 20:00:00 NaN NaN NaN
3 43829 NaN NaN NaN 20:35:00 NaN
4 43830 20:45:00 NaN NaN NaN NaN