使用大熊猫数据帧的形式:
A B C
ID
1 10 NaN NaN
2 20 NaN NaN
3 28 10.0 NaN
4 32 18.0 10.0
5 34 22.0 16.0
6 34 24.0 20.0
7 34 26.0 21.0
8 34 26.0 22.0
如何删除不同数量的初始缺失值?最初,我想向前填充“新”列的最后一个值,所以我最终会得到这个:
A B C
0 10 10.0 10.0
1 20 18.0 16.0
2 28 22.0 20.0
3 32 24.0 21.0
4 34 26.0 22.0
5 34 26.0 22.0
6 34 26.0 22.0
7 34 26.0 22.0
但我想在剩余的行上也有nans也是很自然的:
A B C
0 10 10.0 10.0
1 20 18.0 16.0
2 28 22.0 20.0
3 32 24.0 21.0
4 34 26.0 22.0
5 34 26.0 NaN
6 34 NaN NaN
7 34 NaN NaN
以下是问题的直观表示形式:
以前:
后:
我提出了一个笨重的方法,使用for循环,我使用删除前导nan,计算我删除的值的数量(N),附加最后一个可用数字N次,并逐列构建新的数据帧。但事实证明,对于较大的数据帧来说,这是非常慢的。我觉得这已经是万能熊猫库的内置功能,但到目前为止我还没有找到任何东西。有没有人建议用一种不那么繁琐的方式来做到这一点?df.dropna()
使用示例数据集完成代码:
import pandas as pd
import numpy as np
# sample dataframe
df = pd.DataFrame({'ID':[1,2,3,4,5,6,7,8],
'A': [10,20,28,32,34,34,34,34],
'B': [np.nan, np.nan, 10,18,22,24,26,26],
'C': [np.nan, np.nan, np.nan,10,16,20,21,22]})
df=df.set_index('ID')
# container for dataframe
# to be built using a for loop
df_new=pd.DataFrame()
for col in df.columns:
# drop missing values column by column
ser = df[col]
original_length = len(ser)
ser_new = ser.dropna()
# if leading values are removed for N rows.
# append last value N times for the last rows
if len(ser_new) <= original_length:
N = original_length - len(ser_new)
ser_append = [ser.iloc[-1]]*N
#ser_append = [np.nan]*N
ser_new = ser_new.append(pd.Series(ser_append), ignore_index=True)
df_new[col]=ser_new
df_new
Qyouu
阿晨1998
相关分类