/ / Jak zastosować funkcję do każdej kolumny tabeli przestawnej w pandach? - python, panda, ramka danych

Jak zastosować funkcję do każdej kolumny tabeli przestawnej w pandach? - python, panda, ramka danych

Kod:

df = pd.read_csv("example.csv", parse_dates=["ds"])
df2 = df.set_index(["ds", "city"]).unstack("city")
rm = pd.rolling_mean(df2, 3)
sd = pd.rolling_std(df2,3)

Wyjście df2:

wprowadź opis obrazu tutaj

Co chcę: chcę móc sprawdzić, czy dla każdego miasta, dla każdej daty, czy liczba jest większa niż 1 std dev od średniej rezerwacji dla tego miasta. Dla ex pseudocode:

for each (city column)
for each (date)
see whether the (number of bookings) - (same date and city rolling mean) > (same date and city std dev)
print that date and city and number of bookings

Jaki jest problem: Mam trudność, aby dowiedzieć się, jak uzyskać dostęp do potrzebnych danych z każdej z ramek danych, aby to zrobić. Części pseudokodu w nawiasie są tym, czego potrzebuję pomocy.

Co próbowałem:

df2 ["miasto"] lista (df2)

Oba dają mi błędy.

df2 [1: 2]

Łączenie działa, ale wydaje mi się, że nie jest to najlepszy sposób, aby uzyskać do niego dostęp.

Odpowiedzi:

1 dla odpowiedzi № 1

Powinieneś użyć apply funkcja API DataFrame. Demo jest poniżej:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3,4,5]; "B": [1,2,3,4,5]})
df["C"] = df.apply(lambda row: row["A"]*row["B"], axis=1)

Wydajność:

>>> df
A  B   C
0  1  1   1
1  2  2   4
2  3  3   9
3  4  4  16
4  5  5  25

Bardziej konkretnie dla twojego przypadku:

  1. Musisz wykonać wstępne obliczenia: "ta sama data i środek miasta", "ta sama data i miasto std dev". Możesz użyć groupby funkcja dla niego, pozwala agregować dane według Miasto i data, po tym możesz obliczyć std dev i mean.

  2. Umieść std dev i znaczę w swoim stole, użyj do tego słownika: some_dict = {("city", "date"):[std_dev, mean], ..}. Do umieszczania danych w ramce danych zastosować funkcjonować.

  3. Masz wszystkie dane potrzebne do wykonania czeku zastosować funkcjonować.