我有一个多索引的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。
由于我还在学习如何正确访问/切片/切片数据帧,特别是多索引的数据帧,我不知道如何将这种思想放入代码中。甚至蛮力方法现在都可以做到
答案 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列循环...至少不循环遍历行和列