pandas,如何仅填充前一行最接近非nan值的最后一行

Zhe*_*ong 2 python dataframe pandas fillna

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, 10, (10, 10)), columns=list('ABCDEFGHIJ'))
df[df > 5] = np.nan

for i in range(10):
    df.iloc[i, i % 10] = np.nan

print(df)
Run Code Online (Sandbox Code Playgroud)

原点 df 为:

     A    B    C    D    E    F    G    H    I    J
0  NaN  2.0  NaN  0.0  5.0  4.0  1.0  NaN  NaN  0.0
1  3.0  NaN  NaN  NaN  2.0  0.0  1.0  1.0  NaN  1.0
2  NaN  5.0  NaN  5.0  NaN  0.0  5.0  0.0  4.0  NaN
3  2.0  NaN  NaN  NaN  3.0  5.0  NaN  NaN  NaN  5.0
4  NaN  2.0  NaN  0.0  NaN  NaN  2.0  NaN  2.0  0.0
5  NaN  NaN  NaN  2.0  NaN  NaN  NaN  NaN  0.0  5.0
6  NaN  NaN  0.0  NaN  2.0  NaN  NaN  1.0  NaN  NaN
7  NaN  5.0  1.0  2.0  4.0  NaN  3.0  NaN  3.0  2.0
8  1.0  5.0  1.0  NaN  3.0  NaN  1.0  NaN  NaN  5.0
9  0.0  NaN  NaN  NaN  3.0  NaN  2.0  3.0  5.0  NaN
Run Code Online (Sandbox Code Playgroud)

我只想用前一行最接近的非纳米值填充最后一行,我有一个大数据帧,所以我想使用最快的方法来节省最多的内存,变成:

     A    B    C    D    E    F    G    H    I    J
0  NaN  2.0  NaN  0.0  5.0  4.0  1.0  NaN  NaN  0.0
1  3.0  NaN  NaN  NaN  2.0  0.0  1.0  1.0  NaN  1.0
2  NaN  5.0  NaN  5.0  NaN  0.0  5.0  0.0  4.0  NaN
3  2.0  NaN  NaN  NaN  3.0  5.0  NaN  NaN  NaN  5.0
4  NaN  2.0  NaN  0.0  NaN  NaN  2.0  NaN  2.0  0.0
5  NaN  NaN  NaN  2.0  NaN  NaN  NaN  NaN  0.0  5.0
6  NaN  NaN  0.0  NaN  2.0  NaN  NaN  1.0  NaN  NaN
7  NaN  5.0  1.0  2.0  4.0  NaN  3.0  NaN  3.0  2.0
8  1.0  5.0  1.0  NaN  3.0  NaN  1.0  NaN  NaN  5.0
9  0.0  5.0  1.0  2.0  3.0  5.0  2.0  3.0  5.0  5.0
Run Code Online (Sandbox Code Playgroud)

Shu*_*rma 5

快速解决方案

v = df.values
ix = len(df) - 1 - (~np.isnan(v))[::-1].argmax(0)

df.iloc[-1, :] = v[ix, range(df.shape[1])]
Run Code Online (Sandbox Code Playgroud)

结果

     A    B    C    D    E    F    G    H    I    J
0  NaN  2.0  NaN  0.0  5.0  4.0  1.0  NaN  NaN  0.0
1  3.0  NaN  NaN  NaN  2.0  0.0  1.0  1.0  NaN  1.0
2  NaN  5.0  NaN  5.0  NaN  0.0  5.0  0.0  4.0  NaN
3  2.0  NaN  NaN  NaN  3.0  5.0  NaN  NaN  NaN  5.0
4  NaN  2.0  NaN  0.0  NaN  NaN  2.0  NaN  2.0  0.0
5  NaN  NaN  NaN  2.0  NaN  NaN  NaN  NaN  0.0  5.0
6  NaN  NaN  0.0  NaN  2.0  NaN  NaN  1.0  NaN  NaN
7  NaN  5.0  1.0  2.0  4.0  NaN  3.0  NaN  3.0  2.0
8  1.0  5.0  1.0  NaN  3.0  NaN  1.0  NaN  NaN  5.0
9  0.0  5.0  1.0  2.0  3.0  5.0  2.0  3.0  5.0  5.0
Run Code Online (Sandbox Code Playgroud)