Mam ramkę danych w pandach, w których każda kolumna ma inny zakres wartości. Na przykład:
df:
A B C
1000 10 0.5
765 5 0.35
800 7 0.09
Masz pomysł, jak mogę znormalizować kolumny tej ramki danych, w których każda wartość mieści się w przedziale od 0 do 1?
Moje pożądane wyjście to:
A B C
1 1 1
0.765 0.5 0.7
0.8 0.7 0.18(which is 0.09/0.5)
ddof
argumentem?Odpowiedzi:
Możesz użyć pakietu sklearn i powiązanych z nim narzędzi do wstępnego przetwarzania w celu normalizacji danych.
Aby uzyskać więcej informacji, zapoznaj się z dokumentacją scikit-learn dotyczącą danych przetwarzania wstępnego: skalowanie funkcji do zakresu.
źródło
pd.DataFrame(min_max_scaler.fit_transform(df.T), columns=df.columns, index=df.index)
df=pandas.DataFrame(x_scaled, columns=df.columns)
jeden prosty sposób przy użyciu Pand : (tutaj chcę użyć średniej normalizacji)
aby użyć normalizacji min-max:
Edycja: Aby rozwiązać niektóre obawy, należy powiedzieć, że Pandy automatycznie stosują funkcję kolomnową w powyższym kodzie.
źródło
Na podstawie tego postu: /stats/70801/how-to-normalize-data-to-0-1-range
Możesz wykonać następujące czynności:
Nie musisz się martwić, czy twoje wartości są negatywne czy pozytywne. A wartości powinny być dobrze rozłożone między 0 a 1.
źródło
Twoim problemem jest prosta transformacja działająca na kolumny:
Lub jeszcze bardziej zwięzłe:
źródło
lambda
jest najlepszy :-)axis [...] 0 or 'index': apply function to each column
. Domyślnie jestaxis=0
tak, że ten linijkę można zapisać jeszcze krócej :-) Dzięki @tschm.Jeśli lubisz korzystać z pakietu sklearn, możesz zachować nazwy kolumn i indeksów, używając
loc
takich pand :źródło
Prostota jest piękna:
źródło
df["A"] = (df["A"]-df["A"].min()) / (df["A"].max()-df["A"].min())
df /= df.max()
- zakładając, że celem jest normalizacja każdej kolumny, indywidualnie.Możesz utworzyć listę kolumn, które chcesz znormalizować
Twoja ramka danych Pandas jest teraz znormalizowana tylko w odpowiednich kolumnach
Jeśli jednak chcesz mieć coś przeciwnego , wybierz listę kolumn, których NIE chcesz znormalizować, możesz po prostu utworzyć listę wszystkich kolumn i usunąć te niepożądane
źródło
Myślę, że lepszy sposób na zrobienie tego w pandach jest po prostu
Edytuj Jeśli w twojej ramce danych są liczby ujemne, powinieneś użyć zamiast tego
źródło
Rozwiązanie podane przez Sandmana i Praveen jest bardzo dobre. Jedyny problem z tym, jeśli masz zmienne jakościowe w innych kolumnach ramki danych, ta metoda będzie wymagać pewnych korekt.
Moje rozwiązanie tego typu problemu jest następujące:
źródło
Przykład różnych standaryzacji w Pythonie.
W celach informacyjnych zobacz ten artykuł w Wikipedii: https://en.wikipedia.org/wiki/Niezależne_estimacja_standardu_deviation
Przykładowe dane
Normalizacja za pomocą pand (daje obiektywne szacunki)
Podczas normalizacji po prostu odejmujemy średnią i dzielimy przez odchylenie standardowe.
Normalizacja za pomocą sklearn (daje tendencyjne oszacowania, inne niż pandy)
Jeśli zrobisz to samo,
sklearn
uzyskasz INNE wyjście!Czy błędne szacunki sklearn powodują, że uczenie maszynowe jest mniej wydajne?
NIE.
Oficjalna dokumentacja sklearn.preprocessing.scale stwierdza, że użycie stronniczego estymatora NIE NALEŻY wpływać na wydajność algorytmów uczenia maszynowego i możemy z nich bezpiecznie korzystać.
Co ze skalowaniem MinMax?
W skalowaniu MinMax nie ma obliczeń odchylenia standardowego. Rezultat jest taki sam zarówno w przypadku pand, jak i scikit-learn.
źródło
Możesz chcieć znormalizować niektóre kolumny, a inne pozostać niezmienione, podobnie jak niektóre zadania regresji, których etykiety danych lub kolumny kategorialne pozostają niezmienione. Sugeruję więc ten pythonowy sposób (jest to kombinacja odpowiedzi @shg i @Cina):
źródło
To tylko prosta matematyka. Odpowiedź powinna być tak prosta jak poniżej.
źródło
Z dokumentu pand struktura DataFrame może zastosować do siebie operację (funkcję).
Możesz zastosować niestandardową funkcję do obsługi DataFrame.
źródło
Poniższa funkcja oblicza wynik Z:
źródło
Oto jak to zrobić w kolumnach przy użyciu listy:
źródło
Możesz po prostu użyć funkcji pandas.DataFrame.transform 1 w następujący sposób:
źródło
źródło
Możesz to zrobić w jednym wierszu
pobiera średnią dla każdej kolumny, a następnie odejmuje ją (średnia) od każdego wiersza (średnia dla konkretnej kolumny odejmuje tylko jej wiersz) i dzieli tylko według średniej. Wreszcie otrzymujemy znormalizowany zestaw danych.
źródło
Panda domyślnie wykonuje normalizację kolumnową. Wypróbuj poniższy kod.
Wartości wyjściowe będą w zakresie 0 i 1.
źródło