根据条件在pandas数据帧中填充NaNa

时间:2014-07-31 03:33:18

标签: pandas dataframe

我有一个多索引的pandas数据框,看起来像这样:

name  date               A   B     C
abc   2008-09-22         0   Nan    Nan
      2008-10-12         1   2      Nan
      2009-02-10         2   1      3
cde   2007-10-03         3   NaN    4
      2008-09-21         NaN Nan    Nan
      2008-04-01         5   1      Nan

所以预期的数据框如下所示:

name  date               A   B       C
abc   2008-09-22         0  Nan     Nan
      2008-10-12         1   2      Nan
      2009-02-10         2   1      3
cde   2007-10-03         3   Nan    4
      2008-09-21         0   0      0
      2008-04-01         5   1      0

只有我想到的是循环,这是一个可怕的想法。

我会重新构思我的问题。我需要保留所有未通过非Nan值进行的Nan值。并将Nan的其余部分替换为0.我想在每个名称的基础上执行此操作。

我在想这样的事情 - 1.遍历每个名​​称的列 2.如果第一个值是Nan值,则继续下一行           遍历直到获得非Nan值。在非纳米之后替换所有的Nan           值为0    否则将此列的所有Nan替换为0。

由于我还在学习如何正确访问/切片/切片数据帧,特别是多索引的数据帧,我不知道如何将这种思想放入代码中。甚至蛮力方法现在都可以做到

1 个答案:

答案 0 :(得分:0)

没有在真实数据上尝试过,因此可能需要进行一些调试。没有检查它与您的水平索引,以及算法应该工作:

# store 1st Nan
dict_of_1st_nan  = {}
for c in df.columns:
    list_of_NaNs_in_col = df.c[df.c==np.NaN].index.tolist()
    if list_of_NaNs_in_col != []:
        dict_of_1st_nan[c] = list_of_NaNs_in_col[0])
    else:
        dict_of_1st_nan[c] = None

# replace all Nan with 0
df.fillna(value=0, inplace=True)

# replace 1st Nan stored previously back into df
for col, idx in dict_of_1st_nan.iteritems():
    df.col[idx] = np.NaN

代码执行2x列循环...至少不循环遍历行和列