繁体   English   中英

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

[英]Pandas DataFrame conditional forward filling based on first row values

我有以下 DataFrame:

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() 来实现这一点?

您可以将缺失值转发给助手 Series s然后按此 Series 比较组 - 所有值的第一个值,如果值不大于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM