Pandas Dataframe: Найти условное среднее всех наблюдений, которые соответствуют определенным условиям, РАЗНЫМ в каждой строке - PullRequest
0 голосов
/ 14 мая 2018

Скажем, у меня есть такой фрейм данных:

            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_t0_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

Спасибо !!

1 Ответ

0 голосов
/ 14 мая 2018

Вот один из способов сделать это, используя декартово слияние (не очень хороший выбор для большого набора данных), фильтрацию и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...