基于链对 pandas 行进行循环计算

Implementing a loop calculation on pandas rows based on chain

我有以下代码块,

import pandas as pd
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
        .sort_values(by = 'xx1')
        .reset_index(drop = True))
dat
for i in range(1, dat.shape[0]) :
    if (dat.loc[i, 'aa2'] == 'qq') :
        dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']

dat

我想知道第二个代码块是否

for i in range(1, dat.shape[0]) :
    if (dat.loc[i, 'aa2'] == 'qq') :
        dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']

可以使用 chain 继续第一个块来实现。意思是,我希望有以下的东西,

dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
        .sort_values(by = 'xx1')
        .reset_index(drop = True)
        ### implement the for loop here
     )

任何指针都会很有帮助

您可以 assign xx3 再次通过 mask 中的 qq 值和 forward-filling 它。由于循环从 index=1 开始,我们从 index=1:

开始掩码
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
        .sort_values(by = 'xx1')
        .reset_index(drop = True)
        .assign(xx3 = lambda df: df['xx3'].mask(df['aa2'].eq('qq') & (df.index!=0)).ffill().astype(df['xx3'].dtype))
      )

输出:

   xx1 aa2  xx3
0    1  qq    6
1    2  pp    5
2    3  qq    5