alp*_*nis 4 python numpy dataframe pandas
我正在尝试找到最近的索引,其值不是相对于当前索引的"NaN".所以,假设我有一个带有'NaN'值的DataFrame,如下所示:
A B C
0 2.1 5.3 4.7
1 5.1 4.6 NaN
2 5.0 NaN NaN
3 7.4 NaN NaN
4 3.5 NaN NaN
5 5.2 1.0 NaN
6 5.0 6.9 5.4
7 7.4 NaN NaN
8 3.5 NaN 5.8
Run Code Online (Sandbox Code Playgroud)
如果我目前在索引4,我有值:
A B C
4 3.5 NaN NaN
Run Code Online (Sandbox Code Playgroud)
我想知道'B'相对于索引4的最后已知值,它在索引处1
:
A B C
1 5.1 -> 4.6 NaN
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下内容获取所有具有NaN值的索引的列表:
indexes = df.index[df['B'].apply(np.isnan)]
Run Code Online (Sandbox Code Playgroud)
但是在大型数据库中这似乎效率低下.有没有办法tail
只相对于当前指数的最后一个?
您可以尝试这样的事情,将其转换为与列index
具有相同NaN
值的系列,B
然后使用ffill()
其中包含前一个非缺失索引的所有后续NaN
s:
import pandas as pd
import numpy as np
df['Last_index_notnull'] = df.index.to_series().where(df.B.notnull(), np.nan).ffill()
df['Last_value_notnull'] = df.B.ffill()
df
Run Code Online (Sandbox Code Playgroud)
现在在索引处4
,您知道最后一个非缺失值是4.6
和索引1
.
一些有用的方法来了解
last_valid_index
first_valid_index
对于B
索引中的列4
df.B.ix[:4].last_valid_index()
1
Run Code Online (Sandbox Code Playgroud)
您可以通过这种方式将其用于所有列
pd.concat([df.ix[:i].apply(pd.Series.last_valid_index) for i in df.index],
axis=1).T
Run Code Online (Sandbox Code Playgroud)