为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫:如何删除熊猫数据帧中所有列的前导缺失值?

熊猫:如何删除熊猫数据帧中所有列的前导缺失值?

扬帆大鱼 2022-09-20 17:48:37
使用大熊猫数据帧的形式:     A     B     CID                1   10   NaN   NaN2   20   NaN   NaN3   28  10.0   NaN4   32  18.0  10.05   34  22.0  16.06   34  24.0  20.07   34  26.0  21.08   34  26.0  22.0如何删除不同数量的初始缺失值?最初,我想向前填充“新”列的最后一个值,所以我最终会得到这个:    A     B     C0  10  10.0  10.01  20  18.0  16.02  28  22.0  20.03  32  24.0  21.04  34  26.0  22.05  34  26.0  22.06  34  26.0  22.07  34  26.0  22.0但我想在剩余的行上也有nans也是很自然的:    A     B     C0  10  10.0  10.01  20  18.0  16.02  28  22.0  20.03  32  24.0  21.04  34  26.0  22.05  34  26.0   NaN6  34   NaN   NaN7  34   NaN   NaN以下是问题的直观表示形式:以前:后:我提出了一个笨重的方法,使用for循环,我使用删除前导nan,计算我删除的值的数量(N),附加最后一个可用数字N次,并逐列构建新的数据帧。但事实证明,对于较大的数据帧来说,这是非常慢的。我觉得这已经是万能熊猫库的内置功能,但到目前为止我还没有找到任何东西。有没有人建议用一种不那么繁琐的方式来做到这一点?df.dropna()使用示例数据集完成代码:import pandas as pdimport numpy as np# sample dataframedf = 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 loopdf_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_newdf_new
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

这是一个纯粹的熊猫解决方案。使用应用根据前导 NaN 的数量向上移动值,并使用 ffill,


df.apply(lambda x: x.shift(-x.isna().sum())).ffill()



    A      B       C

1   10  10.0    10.0

2   20  18.0    16.0

3   28  22.0    20.0

4   32  24.0    21.0

5   34  26.0    22.0

6   34  26.0    22.0

7   34  26.0    22.0

8   34  26.0    22.0


查看完整回答
反对 回复 2022-09-20
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我们可以利用每个序列,并按缺失值的数量移动每个序列shift


d = df.isna().sum(axis=0).to_dict() # calculate the number of missing rows per column 


for k,v in d.items():

    df[k] = df[k].shift(-v).ffill()

--


print(df)


   ID   A     B     C

0   1  10  10.0  10.0

1   2  20  18.0  16.0

2   3  28  22.0  20.0

3   4  32  24.0  21.0

4   5  34  26.0  22.0

5   6  34  26.0  22.0

6   7  34  26.0  22.0

7   8  34  26.0  22.0


查看完整回答
反对 回复 2022-09-20
  • 2 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信