Pandas数据帧:找到所有观测值的条件平均值,这些观测值满足不同的条件

2024-04-25 16:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个数据帧:

            date   M1_start     M1_end  SimPrices_t0_exp
    0 2017-12-31 2018-01-01 2018-01-31         16.151667
    1 2018-01-01 2018-02-01 2018-02-28         45.138445
    2 2018-01-02 2018-02-01 2018-02-28         56.442648
    3 2018-01-03 2018-02-01 2018-02-28         59.769931
    4 2018-01-04 2018-02-01 2018-02-28         50.171695

我想得到SimPrices,to,exp观测值的平均值,每个观测值的'date'值在M1,start和M1,end之间

我试过这个

    mask = ((df['date'] >= df['M1_start']) & (df['date'] <= df['M1_end']))
    df['mymean'] = df['SimPrices_t0_exp'][mask].mean()

不管怎样,每次观察都返回NaN,我相信是因为掩码应用于每一行,单独检查掩码条件,以确定它自己的日期,这永远不会返回true。你知道吗

有人能帮我吗?我已经为这个问题挣扎了两天了

示例:对于第一次观察,结果列在第一次观察时的平均值为45.13,56.44,59.76,50.17(在这种特殊情况下)

如果它对某人有帮助,伪代码应该是这样的:

for obs in observations:
   start = obs.start
   end = obs.end
   sum = 0
   obs_count = 0
   for obs2 in observations:
      if obs2.date >= start and obs2.date <= end:
         sum += obs.SimPrices_t0_exp
         obs_count += 1
   obs.mean = sum/obs_count

谢谢!!你知道吗


Tags: dfdatecountmaskmeanstartend平均值
1条回答
网友
1楼 · 发布于 2024-04-25 16:40:21

在这里,一种方法是使用笛卡尔合并(对于大型数据集来说不是一个好的选择)、过滤和groupby

df = df.assign(key=1)
df_m = df.merge(df, on='key')

df_m.query('M1_start_x <= date_y <= M1_end_x').groupby(['M1_start_x','M1_end_x'])['SimPrices_t0_exp_y'].mean()

输出:

M1_start_x  M1_end_x  
2018-01-01  2018-01-31    52.88068
Name: SimPrices_t0_exp_y, dtype: float64

相关问题 更多 >