Mam mały problem z Pythonem, który próbuję rozwiązać;

Więc mam ramkę danych w tym formacie;

date, product, store, sales_amt
1/1/2019, A, A, 200
1/1/2019,A,B,120
1/2/2019, A, A, 75
1/3/2019,A,A,69
1/3/2019,A,B,23
----
----
----
1/31/2019,A,B,49

Mam scenariusz, w którym mam ramkę danych zawierającą 4 kolumny (data, produkt, sklep i sales_amt)

Daty mają obejmować cały miesiąc (np. w tym przypadku styczeń 2019 r.), ale w ramce danych brakuje niektórych dni.

Czy ktoś ma jakieś wskazówki dotyczące kodu w Pythonie, które mogą zapętlać daty dla określonego miesiąca i dodawać nowy wiersz do ramki danych z brakującą datą, kombinacją produktu / sklepu i wartością sales_amt równą zero?

Na przykład nie ma wpisu dla kombinacji produkt / sklep A / B w dniu 1 lutego 2019

Ostatnim celem jest posiadanie wpisu na każdy dzień tego miesiąca dla każdej kombinacji produktu / sklepu.

Jak najlepiej mogę to zrobić? Wygląda na coś do ponownego próbkowania, ale nie jestem pewien.

Wszelkie pomysły, jak to zrobić, będą naprawdę mile widziane.

Dzięki

-1
jigga 19 listopad 2019, 21:45
1
Witamy w StackOverflow. Na temat, jak zapytać i ... idealny pytanie stosuje się tutaj. StackOverflow to baza wiedzy o specyficznych problemach programistycznych — a nie zasób dotyczący kodowania czy samouczka.
 – 
Prune
19 listopad 2019, 21:57
Jest wiele pytań opublikowanych na SO i wiele innych stron z samouczkami, które pokazują, jak porównywać kolejne wartości w wybranej kolumnie. Użyj tych. Jeśli podejmiesz uczciwą próbę znalezienia rozwiązania i utkniesz, wówczas masz rozsądne pytanie do tej witryny.
 – 
Prune
19 listopad 2019, 21:58
 – 
masotann
19 listopad 2019, 21:59
Dzięki @Nagia, niewielka różnica między tym a moim pytaniem polega na tym, że mam dodatkową kombinację sklepu/produktu do grupowania. Myślę, że to kluczowa rzecz, z którą naprawdę się zmagam.
 – 
jigga
21 listopad 2019, 01:10

1 odpowiedź

Jednym ze sposobów jest utworzenie ramki danych ze wszystkimi niezbędnymi kombinacjami wierszy, a następnie użycie merge z częściowo wypełnioną ramką danych.

# initialize a dataframe with all the rows, with 0 values
dates = pd.date_range('01-01-2019', '01-31-2019')
products = ['a','b']
stores = ['a','b']

df_default = pd.DataFrame(list(itertools.product(dates, products, stores)))

#changing to string type so can join with second dataframe easier
df_default[0] = df_default.astype(str)
df_default[3] = 0
print(df_default)
             0  1  2  3
0   2019-01-01  a  a  0
1   2019-01-01  a  b  0
2   2019-01-01  b  a  0
3   2019-01-01  b  b  0
4   2019-01-02  a  a  0

# make a partially filled dataframe
df = pd.DataFrame([('2019-01-01', 'a','a', 1),
               ('2019-01-01', 'b', 'a',2)])

# use merge to get the values of df into df_default
print(pd.merge(df_default,s, how='left', on=[0,1,2]).drop('3_x',axis=1).fillna(0).head(5))

            0  1  2  3_y
0  2019-01-01  a  a  1.0
1  2019-01-01  a  b  0.0
2  2019-01-01  b  a  2.0
3  2019-01-01  b  b  0.0
4  2019-01-02  a  a  0.0

Mam nadzieję, że to pomoże

0
masotann 21 listopad 2019, 23:29