我有一个形状为 (40,500) 的数据框。数据框中的每一行都有一些数值,直到某个可变列号 k,之后的所有条目都是 nan。
我正在尝试获取每行中最后一个非 nan 列的值。有没有一种方法可以在不循环遍历数据帧的所有行的情况下执行此操作?
示例数据框:
2016-06-02 7.080 7.079 7.079 7.079 7.079 7.079 nan nan nan
2016-06-08 7.053 7.053 7.053 7.053 7.053 7.054 nan nan nan
2016-06-09 7.061 7.061 7.060 7.060 7.060 7.060 nan nan nan
2016-06-14 nan nan nan nan nan nan nan nan nan
2016-06-15 7.066 7.066 7.066 7.066 nan nan nan nan nan
2016-06-16 7.067 7.067 7.067 7.067 7.067 7.067 7.068 7.068 nan
2016-06-21 7.053 7.053 7.052 nan nan nan nan nan nan
2016-06-22 7.049 7.049 nan nan nan nan nan nan nan
2016-06-28 7.058 7.058 7.059 7.059 7.059 7.059 7.059 7.059 7.059
要求输出
2016-06-02 7.079
2016-06-08 7.054
2016-06-09 7.060
2016-06-14 nan
2016-06-15 7.066
2016-06-16 7.068
2016-06-21 7.052
2016-06-22 7.049
2016-06-28 7.059
最佳答案
你需要last_valid_index
使用自定义函数,因为如果所有值都是 NaN
它返回 KeyError
:
def f(x):
if x.last_valid_index() is None:
return np.nan
else:
return x[x.last_valid_index()]
df['status'] = df.apply(f, axis=1)
print (df)
1 2 3 4 5 6 7 8 9 \
0
2016-06-02 7.080 7.079 7.079 7.079 7.079 7.079 NaN NaN NaN
2016-06-08 7.053 7.053 7.053 7.053 7.053 7.054 NaN NaN NaN
2016-06-09 7.061 7.061 7.060 7.060 7.060 7.060 NaN NaN NaN
2016-06-14 NaN NaN NaN NaN NaN NaN NaN NaN NaN
2016-06-15 7.066 7.066 7.066 7.066 NaN NaN NaN NaN NaN
2016-06-16 7.067 7.067 7.067 7.067 7.067 7.067 7.068 7.068 NaN
2016-06-21 7.053 7.053 7.052 NaN NaN NaN NaN NaN NaN
2016-06-22 7.049 7.049 NaN NaN NaN NaN NaN NaN NaN
2016-06-28 7.058 7.058 7.059 7.059 7.059 7.059 7.059 7.059 7.059
status
0
2016-06-02 7.079
2016-06-08 7.054
2016-06-09 7.060
2016-06-14 NaN
2016-06-15 7.066
2016-06-16 7.068
2016-06-21 7.052
2016-06-22 7.049
2016-06-28 7.059
替代解决方案 - fillna
使用方法 ffill
并通过 iloc
选择最后一列:
df['status'] = df.ffill(axis=1).iloc[:, -1]
print (df)
status
0
2016-06-02 7.079
2016-06-08 7.054
2016-06-09 7.060
2016-06-14 NaN
2016-06-15 7.066
2016-06-16 7.068
2016-06-21 7.052
2016-06-22 7.049
2016-06-28 7.059
关于python - 在 Pandas 数据框中跨行获取最后一个非 na 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40583482/