Skip to main content
 首页 » 编程设计

python之在 Pandas 条件下使用 fillna

2025年05月04日20Leo_wl

我有以下要应用的数据框 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