как заполнить недостающие значения, где датой начала был первый день месяца?

#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()