【问题标题】:Modify rows between two flags (values) in dataframe columns修改数据框列中两个标志(值)之间的行
【发布时间】:2022-11-24 23:55:23
【问题描述】:

我想基于两个现有数据框创建一个具有相同形状的新数据框。我有一个数据框代表标志,另一个数据框代表我想要替换的值。

flag 数据框只有1、-1 和 NaN,并且总是在 1 之后我会有一个 -1。所以基本上它是一种“改变状态”的数据框。我想做的是:在1和-1之间的区间,我需要在第二个数据帧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,1,np.nan,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]
                   })

这必须给我:

result = 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,81.4,81.4,79.6,79.6,79.6,79.6,79.6,79.6,79.6,79.6],
               'col3': [np.nan,np.nan,np.nan,79.44,79.44,79.44,79.44,79.44,79.44,79.44,79.44],
               'col4': [np.nan,np.nan,np.nan,np.nan,np.nan,79.03,79.03,79.03,np.nan,np.nan,np.nan]
               })

任何帮助深表感谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我会使用自定义函数:

    def process(s, ref=flag):
        f = ref[s.name] # get matching flag
    
        # create group and mask data outside of 1 -> -1
        m = f.eq(1).cummax() & f[::-1].eq(-1).cummax()
        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.4    NaN    NaN
    2   NaN  81.4    NaN    NaN
    3   NaN  79.6  79.44    NaN
    4   NaN  79.6  79.44    NaN
    5   NaN  79.6  79.44  79.03
    6   NaN  79.6  79.44  79.03
    7   NaN  79.6  79.44  79.03
    8   NaN  79.6  79.44    NaN
    9   NaN  79.6  79.44    NaN
    

    【讨论】:

    • 太感谢了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2021-02-16
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多