【发布时间】:2014-10-11 03:37:44
【问题描述】:
如何返回 pandas 数据框每一列的最后一个非 nan 值的行索引位置,并将位置作为 pandas 数据框返回?
【问题讨论】:
-
如果我的回答让你满意,你可以接受,投票按钮下方会有一个空的勾号。
标签: python-2.7 pandas numpy scipy nan
如何返回 pandas 数据框每一列的最后一个非 nan 值的行索引位置,并将位置作为 pandas 数据框返回?
【问题讨论】:
标签: python-2.7 pandas numpy scipy nan
如果你想要最后一个非 nan(和 non-none)值的行索引,这里是一个单行:
>>> df = pd.DataFrame({
'a':[5,1,2,NaN],
'b':[NaN, 6,NaN, 3]})
>>> df
a b
0 5 NaN
1 1 6
2 2 NaN
3 NaN 3
>>> df.apply(lambda column: column.dropna().index[-1])
a 2
b 3
dtype: int64
解释:
df.apply 在此上下文中将函数应用于数据帧的每一列。我向它传递了一个函数,该函数将一个列作为其参数,并返回该列的最后一个非空索引。
【讨论】:
使用notnull 特别是idxmax 来获取非NaN 值的索引值
In [22]:
df = pd.DataFrame({'a':[0,1,2,NaN], 'b':[NaN, 1,NaN, 3]})
df
Out[22]:
a b
0 0 NaN
1 1 1
2 2 NaN
3 NaN 3
In [29]:
df[pd.notnull(df)].idxmax()
Out[29]:
a 2
b 3
dtype: int64
编辑
实际上正如@Caleb 正确指出的那样,您可以使用为此设计的last_valid_index:
In [3]:
df = pd.DataFrame({'a':[3,1,2,np.NaN], 'b':[np.NaN, 1,np.NaN, -1]})
df
Out[3]:
a b
0 3 NaN
1 1 1
2 2 NaN
3 NaN -1
In [6]:
df.apply(pd.Series.last_valid_index)
Out[6]:
a 2
b 3
dtype: int64
【讨论】:
last_valid_index 更新我的答案是正确的方法
first_valid_index