我的数据框如下所示:
s1 s2 s3 s4
0 v1 v2 v3 v4
0 v5 v6 v7 np.nan
0 v8 np.nan v9 np.nan
0 v10 np.nan np.nan np.nan
基本上从上到下有数值,并且在一些随机索引值的列之间将仅切换到np.nan。
我已经使用.apply(pd.Series.last_valid_index)来获取值仍然是数值的索引,但是,我不确定检索一个我有实际值的系列的最有效方法最后一个有效索引的值。
理想情况下,我可以推导出一个类似的系列:
value
s1 v10
s2 v6
s3 v9
s4 v4
或作为看起来像
的数据框 s1 s2 s3 s4
0 v10 v6 v9 v4
非常感谢!
答案 0 :(得分:5)
这是使用NumPy索引的一种方式:
# ensure index is normalised
df = df.reset_index(drop=True)
# calculate last valid index across dataframe
idx = df.apply(pd.Series.last_valid_index)
# create result using NumPy indexing
res = pd.Series(df.values[idx, np.arange(df.shape[1])],
index=df.columns,
name='value')
print(res)
s1 v10
s2 v6
s3 v9
s4 v4
Name: value, dtype: object
答案 1 :(得分:4)
这是另一种方法,无需重置索引:
df.apply(lambda x: x[x.notnull()].values[-1])
s1 v10
s2 v6
s3 v9
s4 v4
答案 2 :(得分:2)
您需要规范化索引,找到每列的最后一个有效索引并从中创建数据框。
df = df.reset_index(drop=True)
ser = df.apply(lambda x: x.last_valid_index())
pd.DataFrame([df[col][ser[col]] for col in df.columns], index=df.columns).T
输出:
s1 s2 s3 s4
0 v10 v6 v9 v4
此外,您的原始df
保持不变。