我有以下要应用的数据框 ffill如下:
数据:
print(for_stack.to_dict())
{2.0: {'A_cj8e134xu02pixvky4r70o0se': 1.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
3.0: {'A_cj8e134xu02pixvky4r70o0se': 2.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
4.0: {'A_cj8e134xu02pixvky4r70o0se': 3.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
5.0: {'A_cj8e134xu02pixvky4r70o0se': 4.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
6.0: {'A_cj8e134xu02pixvky4r70o0se': 5.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
7.0: {'A_cj8e134xu02pixvky4r70o0se': 6.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 2.0},
8.0: {'A_cj8e134xu02pixvky4r70o0se': 7.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 3.0},
9.0: {'A_cj8e134xu02pixvky4r70o0se': 8.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
10.0: {'A_cj8e134xu02pixvky4r70o0se': nan, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0}}
我想仅在值为 8 时应用 ffill,这应该会产生所需的输出(请注意,它仅在填充值为 8 时才填充):
{2.0: {'A_cj8e134xu02pixvky4r70o0se': 1.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
3.0: {'A_cj8e134xu02pixvky4r70o0se': 2.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
4.0: {'A_cj8e134xu02pixvky4r70o0se': 3.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
5.0: {'A_cj8e134xu02pixvky4r70o0se': 4.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
6.0: {'A_cj8e134xu02pixvky4r70o0se': 5.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0},
7.0: {'A_cj8e134xu02pixvky4r70o0se': 6.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 2.0},
8.0: {'A_cj8e134xu02pixvky4r70o0se': 7.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 3.0},
9.0: {'A_cj8e134xu02pixvky4r70o0se': 8.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': nan},
10.0: {'A_cj8e134xu02pixvky4r70o0se': 8.0, 'A_cj8t63fsb04ga5bm4ongrlx6h': 1.0}}
在这方面的任何帮助都会很棒!
请您参考如下方法:
所以基本上你想用 8 填充 nan 如果只有以前的值是 8:
df[df.shift().eq(8) & df.isnull()] = 8
我错过了 ffill 部分。试试这个简单的循环:
for col in df.columns:
filters = df[col].eq(8) | df[col].isnull()
df.loc[filters,col] = df.loc[filters,col].ffill()
编辑2:今天早上匆匆离开,没有仔细查看。这是一个修复:
for col in df.columns:
# mark all na blocks with their previous row
filters = (~df[col].isna()).cumsum()
# record those nan blocks with starting 8
eq8 = filters[df[col].eq(8)]
# filter these block
filters = filters.isin(eq8)
# fill these block with 8
df.loc[filters, col] = 8
