Pandas DataFrame 基于第一行值的条件前向填充

Pandas DataFrame conditional forward filling based on first row values

我有以下数据框:

import pandas as pd
df = pd.DataFrame({
    'col1':['A',pd.NA,pd.NA,pd.NA,pd.NA, 'B', pd.NA, pd.NA],
    'col2':[9.5, 6,24,8, 30, 7, 6, 8],
    })
print(df)

给予:

   col1  col2
0     A   9.5
1  <NA>   6.0
2  <NA>  24.0
3  <NA>   8.0
4  <NA>  30.0
5     B   7.0
6  <NA>   6.0
7  <NA>   8.0

我想要实现的是前向填充 col1,但不是在 col2 中的值大于我正向填充的行的 col2 值的行中。像这样:

   col1  col2
0     A   9.5
1     A   6.0
2  <NA>  24.0
3     A   8.0
4  <NA>  30.0
5     B   7.0
6     B   6.0
7  <NA>   8.0

此处,索引 1 和 3 是向前填充的,但索引 2 和 4 不是,因为 col2 值 (24, 30) 大于初始行的 col2 值 (9.5)

我可以通过遍历 df 来达到预期的结果,如下所示:

val2 = -1
for i, r in df.iterrows():
    if not pd.isnull(r['col1']):
        val1 = r['col1']
        val2 = r['col2']
    else:
        if r['col2']<val2:
            df.loc[i, 'col1'] = val1
print(df)

有没有不使用 iterrows() 就可以实现的方法?

您可以将缺失值转发给助手系列 s,然后按该系列比较组 - 所有值的第一个值,如果值不大于 numpy.where:

s = df['col1'].ffill()

df['col1'] = np.where(df.groupby(s)['col2'].transform('first').gt(df['col2']),s,df['col1'])
print (df)
   col1  col2
0     A   9.5
1     A   6.0
2  <NA>  24.0
3     A   8.0
4  <NA>  30.0
5     B   7.0
6     B   6.0
7  <NA>   8.0