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组?