pandas 修改 Dataframe 列中两个标志(值)之间的行

ktecyv1j  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(134)

我想基于两个现有 Dataframe 创建一个具有相同形状的新 Dataframe 。我有一个表示标志的 Dataframe ,另一个包含我想替换的值。
flag Dataframe 只有1、-1和NaN,在1之后总是会有-1。所以基本上它是一种“状态变化”的 Dataframe 。我想做的是:在区间1和-1之间,我需要在第二个 Dataframe PR中填入相同区间的平均值。

flag = pd.DataFrame({'col1': [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                   'col2': [np.nan,1,-1,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,-1],
                   'col3': [np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,-1],
                   'col4': [np.nan,np.nan,np.nan,np.nan,np.nan,1,np.nan,-1,np.nan,np.nan,np.nan]
                   })

PR = pd.DataFrame({'col1': [81,81.3,80.7,81.5,81,80.4,80.3,81,79.5,80.7],
                   'col2': [80.9,81.6,81.2,81.7,80.9,79.7,79.3,79.1,79,77.5],
                   'col3': [81.1,81.3,81,81.6,80.8,79.5,79.2,78.8,78.8,77.4],
                   'col4': [80.1,80.6,79.9,80.4,80.4,79.3,79,78.8,78.4,77]
                   })

这就得给予我:

col1   col2   col3   col4
0   NaN    NaN    NaN    NaN
1   NaN  81.40    NaN    NaN
2   NaN  81.40    NaN    NaN
3   NaN    NaN  79.44    NaN
4   NaN  79.25  79.44    NaN
5   NaN  79.25  79.44  79.03
6   NaN  79.25  79.44  79.03
7   NaN  79.25  79.44  79.03
8   NaN  79.25  79.44    NaN
9   NaN  79.25  79.44    NaN

任何帮助都是非常感谢的!

6pp0gazn

6pp0gazn1#

我将使用一个自定义函数:

def process(s, ref=flag):
    f = ref[s.name] # get matching flag

    # create group and mask data outside of 1 -> -1
    m = (f.map({1: True, -1: False}).ffill()
         | f.eq(-1)
        )
    group = f.eq(1).cumsum().where(m)

    # transform to mean
    return s.groupby(group).transform('mean') 

out = PR.apply(process, ref=flag).round(2)

输出量:

col1   col2   col3   col4
0   NaN    NaN    NaN    NaN
1   NaN  81.40    NaN    NaN
2   NaN  81.40    NaN    NaN
3   NaN    NaN  79.44    NaN
4   NaN  79.25  79.44    NaN
5   NaN  79.25  79.44  79.03
6   NaN  79.25  79.44  79.03
7   NaN  79.25  79.44  79.03
8   NaN  79.25  79.44    NaN
9   NaN  79.25  79.44    NaN

相关问题