有没有办法修剪数据框中每列的尾随 NaN?
熟悉
dropna()
及其参数(例如,轴、方式)来处理此类问题,但似乎没有解决这种情况。
示例数据如下所示:
2023-02-10 NaN NaN NaN 0.00 0.00 NaN
2023-02-13 NaN NaN NaN 0.02 0.02 NaN
2023-02-14 NaN NaN NaN 0.00 0.00 NaN
2023-02-15 NaN NaN NaN 0.01 0.01 NaN
2023-02-16 NaN NaN NaN -0.01 -0.01 NaN
2023-02-17 NaN NaN NaN -0.01 -0.01 NaN
2023-02-21 NaN NaN NaN -0.03 -0.03 NaN
2023-02-22 NaN NaN NaN 0.00 0.00 NaN
2023-02-23 NaN NaN NaN 0.00 0.00 NaN
2023-02-24 NaN -0.02 NaN -0.02 -0.02 NaN
2023-02-27 NaN 0.01 NaN 0.01 0.01 NaN
2023-02-28 NaN 0.03 0.03 0.00 0.00 NaN
2023-03-01 NaN -0.04 -0.04 -0.01 -0.01 NaN
2023-03-02 NaN 0.00 0.00 0.00 0.00 NaN
2023-03-03 NaN -0.01 -0.01 0.04 0.04 NaN
2023-03-06 NaN -0.02 -0.02 0.02 0.02 NaN
2023-03-07 -0.01 -0.01 -0.01 -0.01 -0.01 NaN
2023-03-08 -0.01 -0.01 -0.01 NaN 0.01 NaN
2023-03-09 0.00 -0.02 -0.02 NaN -0.01 NaN
2023-03-10 -0.03 -0.01 -0.01 NaN -0.01 NaN
2023-03-13 0.02 -0.03 -0.03 NaN 0.01 NaN
2023-03-14 -0.02 -0.02 -0.02 NaN 0.01 NaN
2023-03-15 -0.04 0.00 0.00 NaN 0.00 NaN
2023-03-16 -0.03 0.00 0.00 NaN 0.02 NaN
2023-03-17 0.01 -0.02 -0.02 NaN -0.01 -0.01
2023-03-20 -0.01 -0.01 -0.01 NaN 0.02 0.02
2023-03-21 0.03 0.01 0.01 NaN 0.01 0.01
2023-03-22 0.03 -0.05 -0.05 NaN -0.01 -0.01
2023-03-23 -0.01 -0.02 -0.02 NaN 0.01 0.01
2023-03-24 0.01 0.00 0.00 NaN 0.01 0.01
我想要一个如下所示的结果:
2023-02-10 NaN NaN NaN NaN 0.00 NaN
2023-02-13 NaN NaN NaN NaN 0.02 NaN
2023-02-14 NaN NaN NaN NaN 0.00 NaN
2023-02-15 NaN NaN NaN NaN 0.01 NaN
2023-02-16 NaN NaN NaN NaN -0.01 NaN
2023-02-17 NaN NaN NaN NaN -0.01 NaN
2023-02-21 NaN NaN NaN NaN -0.03 NaN
2023-02-22 NaN NaN NaN NaN 0.00 NaN
2023-02-23 NaN NaN NaN NaN 0.00 NaN
2023-02-24 NaN -0.02 NaN NaN -0.02 NaN
2023-02-27 NaN 0.01 NaN NaN 0.01 NaN
2023-02-28 NaN 0.03 0.03 NaN 0.00 NaN
2023-03-01 NaN -0.04 -0.04 NaN -0.01 NaN
2023-03-02 NaN 0.00 0.00 0.00 0.00 NaN
2023-03-03 NaN -0.01 -0.01 0.02 0.04 NaN
2023-03-06 NaN -0.02 -0.02 0.00 0.02 NaN
2023-03-07 -0.01 -0.01 -0.01 0.01 -0.01 NaN
2023-03-08 -0.01 -0.01 -0.01 -0.01 0.01 NaN
2023-03-09 0.00 -0.02 -0.02 -0.01 -0.01 NaN
2023-03-10 -0.03 -0.01 -0.01 -0.03 -0.01 NaN
2023-03-13 0.02 -0.03 -0.03 0.00 0.01 NaN
2023-03-14 -0.02 -0.02 -0.02 0.00 0.01 NaN
2023-03-15 -0.04 0.00 0.00 -0.02 0.00 NaN
2023-03-16 -0.03 0.00 0.00 0.01 0.02 NaN
2023-03-17 0.01 -0.02 -0.02 0.00 -0.01 -0.01
2023-03-20 -0.01 -0.01 -0.01 -0.01 0.02 0.02
2023-03-21 0.03 0.01 0.01 0.00 0.01 0.01
2023-03-22 0.03 -0.05 -0.05 0.04 -0.01 -0.01
2023-03-23 -0.01 -0.02 -0.02 0.02 0.01 0.01
2023-03-24 0.01 0.00 0.00 -0.01 0.01 0.01
IIUC,您想要删除尾随的 NaN 并将系列“推”到底部,忽略索引。
dropna
将无法实现这一目标。
您应该使用自定义函数:
def trim_last_nan(s):
# identify rows that are not trailing NaNs
m = s[::-1].notna().cummax()[::-1]
# select them, reindex
return s[m].set_axis(s.index[-m.sum():])
out = df.apply(trim_last_nan)
输出:
1 2 3 4 5 6
2023-02-10 NaN NaN NaN NaN 0.00 NaN
2023-02-13 NaN NaN NaN NaN 0.02 NaN
2023-02-14 NaN NaN NaN NaN 0.00 NaN
2023-02-15 NaN NaN NaN NaN 0.01 NaN
2023-02-16 NaN NaN NaN NaN -0.01 NaN
2023-02-17 NaN NaN NaN NaN -0.01 NaN
2023-02-21 NaN NaN NaN NaN -0.03 NaN
2023-02-22 NaN NaN NaN NaN 0.00 NaN
2023-02-23 NaN NaN NaN NaN 0.00 NaN
2023-02-24 NaN -0.02 NaN NaN -0.02 NaN
2023-02-27 NaN 0.01 NaN NaN 0.01 NaN
2023-02-28 NaN 0.03 0.03 NaN 0.00 NaN
2023-03-01 NaN -0.04 -0.04 NaN -0.01 NaN
2023-03-02 NaN 0.00 0.00 0.00 0.00 NaN
2023-03-03 NaN -0.01 -0.01 0.02 0.04 NaN
2023-03-06 NaN -0.02 -0.02 0.00 0.02 NaN
2023-03-07 -0.01 -0.01 -0.01 0.01 -0.01 NaN
2023-03-08 -0.01 -0.01 -0.01 -0.01 0.01 NaN
2023-03-09 0.00 -0.02 -0.02 -0.01 -0.01 NaN
2023-03-10 -0.03 -0.01 -0.01 -0.03 -0.01 NaN
2023-03-13 0.02 -0.03 -0.03 0.00 0.01 NaN
2023-03-14 -0.02 -0.02 -0.02 0.00 0.01 NaN
2023-03-15 -0.04 0.00 0.00 -0.02 0.00 NaN
2023-03-16 -0.03 0.00 0.00 0.01 0.02 NaN
2023-03-17 0.01 -0.02 -0.02 0.00 -0.01 -0.01
2023-03-20 -0.01 -0.01 -0.01 -0.01 0.02 0.02
2023-03-21 0.03 0.01 0.01 0.00 0.01 0.01
2023-03-22 0.03 -0.05 -0.05 0.04 -0.01 -0.01
2023-03-23 -0.01 -0.02 -0.02 0.02 0.01 0.01
2023-03-24 0.01 0.00 0.00 -0.01 0.01 0.01