Подтвердить что ты не робот

Найдите первые и последние значения не NaN в Pandas DataFrame

У меня есть индекс Pandas DataFrame, индексированный по дате. Существует несколько столбцов, но многие столбцы заполняются только частью временного ряда. Я хотел бы найти, где расположены первые и последние значения не NaN, чтобы я мог извлечь даты и посмотреть, как долго временные ряды предназначены для определенного столбца.

Может ли кто-нибудь указать мне в правильном направлении, как я мог бы делать что-то подобное? Спасибо заранее.

4b9b3361

Ответ 1

Решение

@behzad.nouri отлично работало, чтобы вернуть первый и последний не NaN values с помощью Series.first_valid_index и Series.last_valid_index соответственно.

Ответ 2

Вот несколько полезных примеров.

Серии

s = pd.Series([np.NaN, 1, np.NaN, 3, np.NaN], index=list('abcde'))
s

a    NaN
b    1.0
c    NaN
d    3.0
e    NaN
dtype: float64

# first valid index
s.first_valid_index()
# 'b'

# first valid position
s.index.get_loc(s.first_valid_index())
# 1

# last valid index
s.last_valid_index()
# 'd'

# last valid position
s.index.get_loc(s.last_valid_index())
# 3

DataFrame

(first|last)_valid_index не определен в DataFrames, но вы можете применить их к каждому столбцу, используя команду apply.

df = pd.DataFrame({
    'A': [np.NaN, 1, np.NaN, 3, np.NaN], 
    'B': [1, np.NaN, np.NaN, np.NaN, np.NaN]
})
df

     A    B
0  NaN  1.0
1  1.0  NaN
2  NaN  NaN
3  3.0  NaN
4  NaN  NaN


df.apply(pd.Series.first_valid_index)

A    1
B    0
dtype: int64

df.apply(pd.Series.last_valid_index)

A    3
B    0
dtype: int64

Вы также можете использовать notna и idxmax:

# fast valid index
df.notna().idxmax()

A    1
B    0
dtype: int64

# last valid index
df.notna()[::-1].idxmax()

A    3
B    0
dtype: int64