Python: повышающая дискретизация с помощью операции обратного суммирования

Я хочу пересчитать столбец данных, а именно, чтобы пересчитать его наоборот sum() стиль работы, предполагая, что каждая точка четна. Меня не особо волнует значение финальной точки - для моего случая это не имеет значения.

Вот упрощенная версия:

   Input  Output
0   10.0    3.33
1    NaN    3.33
2    NaN    3.33
3   24.0    6.00
4    NaN    6.00
5    NaN    6.00
6    NaN    6.00
7   15.0   15.00

Есть ли чистый / питонный способ сделать это? Мне не удалось найти ничего подобного в библиотеках повторной выборки, но я хотел спросить более опытных людей, прежде чем я соберу итеративное решение.

2 ответа

Решение

Использование groupby а также transform от mean:

df['Input'].fillna(0).groupby(df['Input'].notna().cumsum()).transform('mean')

0     3.333333
1     3.333333
2     3.333333
3     6.000000
4     6.000000
5     6.000000
6     6.000000
7    15.000000
Name: Input, dtype: float64

Куда,

df['Input'].notna().cumsum()

0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    3
Name: Input, dtype: int64

Идея здесь состоит в том, чтобы вычислить среднее значение ненулевого значения, включая все нулевые ячейки, следующие за ним, и передать результат обратно на вход. Нам нужно fillna позвоните сюда, потому что mean будет игнорировать NaN по умолчанию.

Отличный ответ от cs95. Вот то же самое в виде функции:

      def reverse_sum(resampler):
    s = resampler.asfreq()
    return s.fillna(0).groupby(s.notna().cumsum()).transform('mean')

Это позволяет обезьяньим патчить панд, чтобы он работал с .resample():

      import pandas as pd
from pandas.core.resample import Resampler
setattr(pd.core.resample.Resampler, "reverse_sum", reverse_sum)

Контрольная работа:

      s = pd.Series([1, 2, -2], index=pd.period_range(start='2012-01-01', end='2012-01-03', freq='D'))
# 2012-01-01    1
# 2012-01-02    2
# 2012-01-03   -2

s.resample('12H').reverse_sum()

# 2012-01-01 00:00    0.5
# 2012-01-01 12:00    0.5
# 2012-01-02 00:00    1.0
# 2012-01-02 12:00    1.0
# 2012-01-03 00:00   -1.0
# 2012-01-03 12:00   -1.0
Другие вопросы по тегам