Pandas 基于条件的熊猫数据帧填充

Pandas 基于条件的熊猫数据帧填充,pandas,dataframe,Pandas,Dataframe,我有一个多索引的熊猫数据帧,看起来像这样: 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

我有一个多索引的熊猫数据帧,看起来像这样:

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之后替换所有Nan 带0的值 否则,将此列的所有Nan替换为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列循环。。。至少不要在行和列之间循环

尝试思考。。。如果您可以描述第一个Nan,则可以在执行df.fillna(值=0,轴=1)后替换它们。尝试构造算法来存储和替换每列中的第一个Na应该并不困难,并避免昂贵的循环为什么结果中的第二个C值仍然是NaN,您是指第一个NaN组?