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)
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)