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

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

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

  1. 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],
  2. 'col2': [np.nan,1,-1,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,-1],
  3. 'col3': [np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,-1],
  4. 'col4': [np.nan,np.nan,np.nan,np.nan,np.nan,1,np.nan,-1,np.nan,np.nan,np.nan]
  5. })
  6. PR = pd.DataFrame({'col1': [81,81.3,80.7,81.5,81,80.4,80.3,81,79.5,80.7],
  7. 'col2': [80.9,81.6,81.2,81.7,80.9,79.7,79.3,79.1,79,77.5],
  8. 'col3': [81.1,81.3,81,81.6,80.8,79.5,79.2,78.8,78.8,77.4],
  9. 'col4': [80.1,80.6,79.9,80.4,80.4,79.3,79,78.8,78.4,77]
  10. })

这就得给予我:

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

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

6pp0gazn

6pp0gazn1#

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

  1. def process(s, ref=flag):
  2. f = ref[s.name] # get matching flag
  3. # create group and mask data outside of 1 -> -1
  4. m = (f.map({1: True, -1: False}).ffill()
  5. | f.eq(-1)
  6. )
  7. group = f.eq(1).cumsum().where(m)
  8. # transform to mean
  9. return s.groupby(group).transform('mean')
  10. out = PR.apply(process, ref=flag).round(2)

输出量:

  1. col1 col2 col3 col4
  2. 0 NaN NaN NaN NaN
  3. 1 NaN 81.40 NaN NaN
  4. 2 NaN 81.40 NaN NaN
  5. 3 NaN NaN 79.44 NaN
  6. 4 NaN 79.25 79.44 NaN
  7. 5 NaN 79.25 79.44 79.03
  8. 6 NaN 79.25 79.44 79.03
  9. 7 NaN 79.25 79.44 79.03
  10. 8 NaN 79.25 79.44 NaN
  11. 9 NaN 79.25 79.44 NaN
展开查看全部

相关问题