#python #pandas #pandas-groupby #data-science #pandas-resample
Вопрос:
у меня есть такой фрейм данных:
tst=
Date % on Merchant % on Customer Merchants Location
2021-08-04 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-05 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-06 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-01 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-02 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-03 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-04 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-05 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-06 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
uni_ind= ['% on Merchant','% on Customer','Merchants','Location']
я ищу выход:
Date % on Merchant % on Customer Merchants Location
2021-08-01 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-02 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-03 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-04 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-05 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-06 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-01 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-02 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-03 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-04 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-05 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-06 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
tst.groupby(uni_ind).resample('D').bfill()..reset_index(level=(0,1,2,3),drop= True).reset_index()
Ответ №1:
- создайте диапазон дат для дней в начале месяца для продавцов, где они отсутствуют
- внешнее соединение с исходным фреймом данных и
fillna(method="bfill")
import pandas as pd
import io
df = pd.read_csv(io.StringIO("""Date % on Merchant % on Customer Merchants Location
2021-08-04 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-05 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-06 0.0 0.10 Zwarma - The Shawarma Maker Palani
2021-08-01 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-02 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-03 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-04 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-05 0.0 0.12 Zwarma - The Shawarma Maker Pollachi
2021-08-06 0.0 0.12 Zwarma - The Shawarma Maker Pollachi """), sep="ss ", engine="python")
df["Date"] = pd.to_datetime(df["Date"])
df = (
df.merge(
df.groupby(
[df["Date"].dt.year, df["Date"].dt.month, "Merchants", "Location"], as_index=False
)
.agg({"Date": "min"})
.loc[lambda d: d["Date"].dt.day.gt(1)]
.apply(
lambda r: pd.Series(
{
"Date": list(
pd.date_range(
r["Date"] - pd.offsets.MonthBegin(1),
r["Date"] - pd.Timedelta(days=1),
)
),
"Merchants": r["Merchants"],
"Location": r["Location"]
}
),
axis=1,
)
.explode("Date"),
on=["Date", "Merchants", "Location"],
how="outer",
)
.sort_values(["Merchants", "Location", "Date"])
.fillna(method="bfill")
)
df
Дата | % на торговца | % от клиента | Торговцы | Расположение | |
---|---|---|---|---|---|
9 | 2021-08-01 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
10 | 2021-08-02 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
11 | 2021-08-03 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
0 | 2021-08-04 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
1 | 2021-08-05 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
2 | 2021-08-06 00:00:00 | 0 | 0.1 | Цварма — Производитель Шаурмы | Палани |
3 | 2021-08-01 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
4 | 2021-08-02 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
5 | 2021-08-03 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
6 | 2021-08-04 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
7 | 2021-08-05 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
8 | 2021-08-06 00:00:00 | 0 | 0.12 | Цварма — Производитель Шаурмы | Поллачи |
Комментарии:
1. при импорте ввода-вывода столбец местоположения был удален, и он был объединен с продавцом. Решение работает для этого, но я не хочу объединять столбец «продавец» и «местоположение».. Пожалуйста, дайте мне знать.. Было бы здорово, если бы одно и то же решение могло заполнить пропущенные даты в конце месяца, выбрав последнее доступное значение..
2. из ваших примерных данных я не мог понять, как определить продавца и местоположение. это последнее место? решение действительно одно и то же, добавьте местоположение в groupby и постройте серию
3. обновлено, включая также местоположение, просто систематически добавляемое
Ответ №2:
Ниже приведена более простая версия ответа.
Шаг 1 : получить первую дату месяца resmaple месяц начала
tst1 = ТСТ.метод groupBy(uni_ind).разрешение(‘МС’).bfill().reset_index(уровня=(0,1,2,3,4,5),капля= истинный).reset_index()
Шаг 2 : Добавление в месяц сначала с оригинальными ДФ
tst3 = ТСТ.reset_index().добавить(tst1)
Шаг 3 : удаление дубликатов, а может быть месяц начинается за несколько месяцев
tst3.drop_duplicates( параметр inplace= true, то ignore_index= false , то имейте= «первый»)
этап 4 : установка даты в качестве индекса для пересчета функции, чтобы использовать
tst3.set_index(‘Date’и параметр inplace=верно)
Шаг 5 : разрешение фр
tst3.groupby(uni_ind , dropna= Ложь).повторная выборка(‘D’).заполнение().reset_index( уровень=(0,1,2,3,4,5),падение= Истина).reset_index()