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