Я попытка:
[*]группировать по всем демографическим признакам
[*]применить функцию к каждому временному ряду подсчета населения по демографической группе (для этого требуется манипулировать как столбцом даты, так и столбцом населения)
[*]создать новый столбец в исходном (несгруппированном) DataFrame на основе этой функции
Функция в (2) воздействует на существующий столбец населения с отсутствующими значениями, перераспределяя подсчеты после разрыва назад по пробелу. Я считаю, что функция работает так, как задумано, но я изо всех сил пытаюсь встроить ее в контекст группировки и превратить в новый столбец в DataFrame.
Вот пример данных:
Код: Выделить всё
age race gender date population
0 15-24 AAPI Male 2020-01-01 1.0
1 15-24 AAPI Male 2020-01-02 2.0
2 15-24 AAPI Male 2020-01-03 2.0
...
7 15-24 Black Female 2020-01-01 0.0
8 15-24 Black Female 2020-01-02 NaN
9 15-24 Black Female 2020-01-03 3.0
Код: Выделить всё
age race gender date population interpolated
0 15-24 AAPI Male 2020-01-01 1.0 1.0
1 15-24 AAPI Male 2020-01-02 2.0 2.0
2 15-24 AAPI Male 2020-01-03 2.0 2.0
...
7 15-24 Black Female 2020-01-01 0.0 0.0
8 15-24 Black Female 2020-01-02 NaN 1.5
9 15-24 Black Female 2020-01-03 3.0 1.5
Код: Выделить всё
gaps = [
{
"gap": [2020-01-02],
"day_after": 2020-01-03,
}
]
def bfill_pop(gaps, group):
for el in gaps:
fill_val = group.loc[group["date"] == el["day_after"], "Admissions"] / (
len(el["gap"]) + 1
)
group.loc[group["date"].isin(el["gap"]), "population"] = fill_val
group.loc[group["date"] == el["day_after"], "population"] = fill_val
return group.rename(columns={"population": "interpolated"})["interpolated"]
Код: Выделить всё
df["interpolated"] = df.groupby(["age", "race", "gender"]).apply(
lambda g: bfill_pop(gaps, g)
)
Код: Выделить всё
> ValueError: cannot handle a non-unique multi-index!
Подробнее здесь: https://stackoverflow.com/questions/784 ... le-columns