Menu
CoddyTech

Pandas Cheat Sheet: ściąga z pandas

Ostatnia aktualizacja

Tworzenie DataFrame'u

Małe DataFrame'y budowane ręcznie: do przykładów, testów i tabel pomocniczych.

ZadanieKod
Import pandas i NumPyimport pandas as pd import numpy as np
Ze słownika kolumndf = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]})
Z listy wierszypd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}])
Z tablicy NumPypd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"])
Series z etykietamis = pd.Series([3, 5, 2], index=["a", "b", "c"])
Zakres datpd.date_range("2026-01-01", periods=7, freq="D")

Odczyt i zapis plików

Jedno wywołanie wczytuje plik do DataFrame'u, a drugie zapisuje go z powrotem.

ZadanieKod
Wczytaj plik CSVdf = pd.read_csv("sales.csv")
Tylko wybrane kolumny, z prawdziwymi datamipd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"])
Kolumna jako indekspd.read_csv("sales.csv", index_col="id")
Tabulator lub inny separatorpd.read_csv("sales.tsv", sep="\t")
Dodatkowe znaczniki jako brakipd.read_csv("sales.csv", na_values=["n/a", "-"])
Tylko pierwsze wierszepd.read_csv("sales.csv", nrows=1000)
Arkusz Excela (wymaga openpyxl)pd.read_excel("report.xlsx", sheet_name="2026")
Rekordy JSONpd.read_json("records.json")
Odczyt z bazy SQLpd.read_sql("SELECT * FROM orders", conn)
Zapis CSV bez indeksudf.to_csv("clean.csv", index=False)
Zapis do Excela lub Parquetdf.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet")

Przeglądanie danych

Pierwsze wywołania przy każdym nowym zbiorze danych.

ZadanieKod
Pierwsze i ostatnie wierszedf.head(), df.tail(3)
Liczba wierszy i kolumndf.shape # (6, 7)
Typy kolumn i liczba wartości niepustychdf.info()
Statystyki kolumn liczbowychdf.describe()
Podsumowanie wszystkich kolumndf.describe(include="all")
Nazwy i typy kolumndf.columns, df.dtypes
Liczność każdej wartościdf["city"].value_counts()
Udział każdej wartościdf["city"].value_counts(normalize=True)
Unikalne wartości i ich liczbadf["city"].unique(), df["city"].nunique()
Braki w każdej kolumniedf.isna().sum()
Losowa próbka wierszydf.sample(3, random_state=0)
Korelacja kolumn liczbowychdf.corr(numeric_only=True)

Wybieranie kolumn i wierszy

loc wybiera po etykiecie i obejmuje koniec wycinka. iloc wybiera po pozycji i go pomija.

ZadanieKod
Jedna kolumna jako Seriesdf["age"]
Kilka kolumn jako DataFramedf[["name", "age"]]
Wiersze i kolumny po etykieciedf.loc[0:2, ["name", "age"]]
Wiersze i kolumny po pozycjidf.iloc[0:2, 0:3]
Jedna wartośćdf.at[0, "age"], df.iat[0, 3]
Ostatni wierszdf.iloc[-1]
Kolumny jednego typudf.select_dtypes(include="number")
Kolumny tekstowe (pandas 3)df.select_dtypes(include="str")
Kolumny po fragmencie nazwydf.filter(like="sal"), df.filter(regex="^(age|salary)$")
Wyszukiwanie wierszy po kolumniedf.set_index("name").loc["Ada", "salary"]
Powrót do indeksu 0, 1, 2df.reset_index(drop=True)
Usuń kolumny lub wierszedf.drop(columns=["email"]), df.drop(index=[0, 1])

Filtrowanie wierszy

Każdy warunek ujmij w nawiasy i łącz je przez & (i), | (lub) oraz ~ (nie).

ZadanieKod
Wiersze spełniające warunekdf[df["age"] > 30]
Oba warunkidf[(df["age"] > 30) & (df["city"] == "Oslo")]
Jeden z warunkówdf[(df["city"] == "Oslo") | (df["salary"] > 6000)]
Wartość z listydf[df["city"].isin(["Oslo", "Rome"])]
Wartość spoza listydf[~df["city"].isin(["Oslo", "Rome"])]
Między dwiema wartościami, z końcamidf[df["age"].between(30, 40)]
Filtr z tekstem zapytaniadf.query("age > 30 and city == 'Oslo'")
Zmienna w zapytaniumin_age = 30 df.query("age > @min_age")
Tekst zawieradf[df["name"].str.contains("e", case=False)]
Wartości brakujące lub obecnedf[df["age"].isna()], df[df["age"].notna()]
Filtruj wiersze i wybierz kolumnydf.loc[df["age"] > 30, ["name", "salary"]]
Pierwsze lub ostatnie n wierszydf.nlargest(3, "salary"), df.nsmallest(2, "age")
Wiersze z powtórzoną wartościądf[df.duplicated(subset=["city"], keep=False)]

Sortowanie i ranking

ZadanieKod
Sortuj po kolumniedf.sort_values("salary")
Od największychdf.sort_values("salary", ascending=False)
Sortuj po kilku kolumnachdf.sort_values(["city", "salary"], ascending=[True, False])
Braki na początkudf.sort_values("age", na_position="first")
Sortuj po indeksiedf.sort_index()
Ranking, 1 to najwyższadf["salary"].rank(ascending=False)

Dodawanie i zmiana kolumn

Operacje na całych kolumnach są szybkie. Po apply sięgaj tylko wtedy, gdy żadna wbudowana metoda nie wystarczy.

ZadanieKod
Nowa kolumna z innychdf["bonus"] = df["salary"] * 0.1
Dodaj kolumnę w łańcuchudf.assign(bonus=lambda d: d["salary"] * 0.1)
Wartość zależna od warunkudf["level"] = np.where(df["age"] >= 40, "senior", "junior")
Wartość zależna od kilku warunkówdf["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior")
Zmień wartości tam, gdzie warunek jest spełnionydf.loc[df["city"] == "Lima", "salary"] = 4000
Mapuj wartości słownikiemdf["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"})
Funkcja na kolumniedf["salary"].apply(lambda x: round(x, -3))
Funkcja na każdej komórcedf[["age", "salary"]].map(lambda x: x / 1000)
Zmień nazwy kolumndf.rename(columns={"salary": "pay"})
Zmień typ kolumnydf["salary"].astype("float64")
Tekst na liczby, błędne na NaNpd.to_numeric(s, errors="coerce")
Liczby w przedziały z etykietamipd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"])
Liczby w równe grupypd.qcut(df["salary"], q=4, labels=False)
Pętla po wierszach (wolna, ostateczność)for row in df.itertuples(): print(row.name, row.salary)

Braki danych i czyszczenie

Brakujące liczby widać jako NaN, brakujące daty jako NaT. Każde z tych wywołań zwraca nowy obiekt, więc przypisz wynik.

ZadanieKod
Odsetek braków w każdej kolumniedf.isna().mean()
Usuń wiersze z jakimkolwiek brakiemdf.dropna()
Usuń wiersze bez kluczowej kolumnydf.dropna(subset=["age"])
Uzupełnij wartością dla każdej kolumnydf.fillna({"age": df["age"].median()})
Uzupełnij z poprzedniego lub następnego wierszadf["age"].ffill(), df["age"].bfill()
Uzupełnij luki interpolacjądf["age"].interpolate()
Znaczniki na brakidf.replace(["n/a", "-", ""], np.nan)
Usuń zduplikowane wierszedf.drop_duplicates()
Zostaw ostatni wiersz dla kluczadf.drop_duplicates(subset=["city"], keep="last")
Uporządkuj nazwy kolumndf.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
Przytnij skrajne wartościdf["salary"].clip(lower=4000, upper=6000)
Typ category dla powtarzalnego tekstudf["city"] = df["city"].astype("category")

Kolumny tekstowe (.str)

W pandas 3 kolumny tekstowe domyślnie dostają dtype str. Metody .str działają na całej kolumnie, a braki pozostają brakami.

ZadanieKod
Wielkie, małe litery lub tytułowedf["name"].str.upper(), df["name"].str.lower(), df["name"].str.title()
Usuń spacje z brzegówdf["name"].str.strip()
Zamień tekstdf["email"].str.replace("mail.com", "example.com")
Zamień wyrażeniem regularnymdf["email"].str.replace(r"@.*", "", regex=True)
Zawiera, zaczyna się oddf["name"].str.contains("a"), df["name"].str.startswith("E")
Długość każdej wartościdf["name"].str.len()
Pierwsze znakidf["name"].str[:2]
Podziel na kolumnydf["email"].str.split("@", expand=True)
Wyciągnij grupą regexdf["email"].str.extract(r"@(\w+)")
Połącz kolumny tekstowedf["name"] + " (" + df["city"] + ")"
Dopełnij liczby zeramidf["salary"].astype("str").str.zfill(6)
Nowy dtype tekstowydf["name"].dtype # str

Daty i czas

Akcesor .dt działa na kolumnach datetime. Posortowany indeks dat (ts poniżej) pozwala wycinać po tekście i robić resampling.

ZadanieKod
Zamień kolumnę na datetimedf["date"] = pd.to_datetime(df["date"])
Parsowanie z dokładnym formatempd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y")
Rok, miesiąc, nazwa dnia tygodniadf["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name()
Grupuj daty po miesiącachdf["date"].dt.to_period("M")
Dni między dwiema datami(pd.Timestamp("2026-12-31") - df["date"]).dt.days
Dodaj dni lub miesiącedf["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1)
Wiersze z zakresu datdf[df["date"].between("2021-01-01", "2022-12-31")]
Indeks dat, wycinany tekstemts = df.set_index("date").sort_index() ts.loc["2021":"2022"]
Suma na miesiącts["salary"].resample("ME").sum()
Średnia tygodniowa; "QE" to kwartały, "YE" latats["salary"].resample("W").mean()
Średnia kroczącats["salary"].rolling(3).mean()
Zmiana względem poprzedniego wierszats["salary"].diff(), ts["salary"].pct_change()
Przesuń wartości o wiersz w dółts["salary"].shift(1)
Suma narastającats["salary"].cumsum()
Ustaw i przelicz strefy czasowets.index.tz_localize("UTC").tz_convert("Europe/Oslo")

Grupowanie i agregacja

groupby dzieli wiersze według klucza, stosuje funkcję do każdej grupy i łączy wyniki.

ZadanieKod
Średnia w grupiedf.groupby("city")["salary"].mean()
Kilka statystyk narazdf.groupby("city")["salary"].agg(["mean", "max", "count"])
Nazwane kolumny wynikudf.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count"))
Grupuj po dwóch kolumnachdf.groupby(["city", "team"])["salary"].sum()
Klucze jako kolumnydf.groupby("city", as_index=False)["salary"].mean()
Liczba wierszy w grupiedf.groupby("city").size()
Wynik grupy w każdym wierszudf["city_avg"] = df.groupby("city")["salary"].transform("mean")
Zostaw tylko niektóre grupydf.groupby("city").filter(lambda g: len(g) >= 2)
Wiersz z maksimum w grupiedf.loc[df.groupby("city")["salary"].idxmax()]
Pierwsze n wierszy w grupiedf.sort_values("salary", ascending=False).groupby("city").head(2)
Numeruj wiersze w każdej grupiedf.groupby("city").cumcount()
Pętla po grupachfor city, group in df.groupby("city"): print(city, len(group))
Filtruj, grupuj i sortuj w jednym łańcuchu(df.query("age > 30") .groupby("city", as_index=False) .agg(avg_pay=("salary", "mean")) .sort_values("avg_pay", ascending=False))

Tabele przestawne i przekształcanie

Dane długie mają jeden wiersz na obserwację. Dane szerokie rozkładają jedną zmienną na kolumny.

ZadanieKod
Tabela przestawnadf.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0)
Tabela przestawna z sumamidf.pivot_table(index="city", values="salary", aggfunc="sum", margins=True)
Zlicz kombinacjepd.crosstab(df["city"], df["team"])
Udziały w wierszupd.crosstab(df["city"], df["team"], normalize="index")
Z szerokiego na długilong = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value")
Z długiego na szerokilong.pivot(index="name", columns="field", values="value")
Wewnętrzny poziom indeksu na kolumnydf.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0)
Jeden wiersz na element listypd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags")
Kodowanie one-hot kolumnypd.get_dummies(df["team"], prefix="team")
Zamień wiersze z kolumnamidf.T

Łączenie DataFrame'ów

concat układa ramki jedna na drugiej, a merge łączy je po kolumnach kluczy, tak jak SQL.

ZadanieKod
Dołącz wierszepd.concat([df_2025, df_2026], ignore_index=True)
Obok siebiepd.concat([left, right], axis=1)
Join po kolumnie kluczaorders.merge(customers, on="customer_id", how="left")
Rodzaje złączeńhow="inner", "left", "right", "outer"
Klucze o różnych nazwachorders.merge(users, left_on="customer_id", right_on="id")
Sprawdź złączenie i oznacz źródło wierszyorders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
Join po indeksieleft.join(right, how="inner")
Wiersze bez dopasowania w drugiej tabeliorders[~orders["customer_id"].isin(customers["customer_id"])]

Wykresy w pandas

pandas rysuje za pomocą Matplotlib. Każde wywołanie wykresu zwraca obiekt Matplotlib ax, więc możesz dalej go stylować.

ZadanieKod
Wykres liniowy seriits["salary"].plot()
Wykres liniowy z dwóch kolumndf.plot(x="date", y="salary")
Wykres słupkowy podsumowaniadf.groupby("city")["salary"].mean().plot.bar()
Posortowane słupki poziomedf["city"].value_counts().sort_values().plot.barh()
Histogramdf["salary"].plot.hist(bins=20)
Wykres punktowydf.plot.scatter(x="age", y="salary")
Wykres pudełkowy dla grupdf.boxplot(column="salary", by="city")
Tytuł i opis osiax = df.plot(x="date", y="salary", title="Salary") ax.set_ylabel("EUR")
Pokaż lub zapisz wykresplt.show(), ax.figure.savefig("salary.png", dpi=150)

pandas 3: stare zapisy i co pisać teraz

Kod skopiowany ze starszych tutoriali często w pandas 3 rzuca błąd albo ostrzeżenie. Używaj zapisów z kolumny pandas 3.

Zadaniepandas 3Stary zapis
Funkcja na każdej komórcedf.map(f)df.applymap(f)
Uzupełnij z poprzedniego wierszadf.ffill()df.fillna(method="ffill")
Dodaj wierszepd.concat([df, new_rows])df.append(new_rows)
Resampling na koniec miesiącats["salary"].resample("ME").sum()resample("M")
Daty co godzinępd.date_range("2026-01-01", periods=24, freq="h")freq="H"
Ustaw jedną wartośćdf.loc[0, "age"] = 37df["age"][0] = 37
Zmień przefiltrowany podzbiórhigh = df[df["salary"] > 5000] high["salary"] = 0high = df[df["salary"] > 5000].copy()
Czy to kolumna tekstowa?df["name"].dtype == "str"df["name"].dtype == object

Kod pandas, po który analityk danych sięga na co dzień, pogrupowany według zadań: tworzenie i wczytywanie danych, przeglądanie, wybieranie i filtrowanie wierszy, dodawanie kolumn, czyszczenie braków, praca z tekstem i datami, grupowanie i agregacja, przekształcanie, łączenie i wykresy. Każdy wiersz to krótki fragment kodu do wklejenia i jedno zdanie o tym, co robi.

Wszystko tutaj jest napisane dla pandas 3, wersji, której używa Coddy: kolumny tekstowe mają nowy dtype str, Copy-on-Write jest zawsze włączony, a usunięte API, takie jak applymap i fillna(method=...), pojawiają się tylko w tabeli starych zapisów. Przykłady korzystają z DataFrame'u df z kolumnami name, city, team, age, salary, date i email. Dopiero zaczynasz z Pythonem? Zajrzyj do ściągi z Pythona i Python playground, a obok tej ściągi trzymaj też ściągi z NumPy, Matplotlib i scikit-learn.

FAQ: ściąga z pandas

Czy ta ściąga z pandas jest darmowa?
Tak. Ta ściąga z pandas jest całkowicie darmowa i nie wymaga rejestracji. Dodaj ją do zakładek albo wydrukuj do PDF z przeglądarki i wracaj, kiedy tylko potrzebujesz dokładnego wywołania dla groupby, merge czy tabeli przestawnej.
Którą wersję pandas obejmuje ta ściąga?
pandas 3. Kolumny tekstowe mają nowy dtype str, Copy-on-Write jest zawsze włączony, a wywołania usunięte w pandas 3 (applymap, fillna(method=...), append, aliasy częstotliwości M i H) pojawiają się tylko w ostatniej tabeli, obok tego, co pisać zamiast nich. Prawie każdy fragment działa też w pandas 2.2, poza wierszami, które opierają się na dtype str lub na Copy-on-Write.
Czym różni się loc od iloc?
loc wybiera po etykiecie, czyli po wartościach indeksu i nazwach kolumn, a wycinek taki jak df.loc[0:2] obejmuje swój koniec. iloc wybiera po pozycji całkowitej, jak lista w Pythonie, więc df.iloc[0:2] zwraca dwa pierwsze wiersze i pomija koniec. Użyj loc z warunkiem, żeby w jednym kroku przefiltrować wiersze i wybrać kolumny: df.loc[df["age"] > 30, ["name"]].
Jak przefiltrować DataFrame po kilku warunkach?
Każdy warunek ujmij w nawiasy i połącz je przez & (i), | (lub) oraz ~ (nie): df[(df["age"] > 30) & (df["city"] == "Oslo")]. Pythonowe and i or nie działają na całych kolumnach. Przy długich filtrach df.query("age > 30 and city == 'Oslo'") jest czytelniejsze.
Czym różnią się merge, join i concat?
merge łączy dwa DataFrame'y po kolumnach kluczy, jak join w SQL, z how="inner", "left", "right" albo "outer". join to skrót, który łączy po indeksie. concat w ogóle nie dopasowuje kluczy: układa ramki jedna na drugiej albo obok siebie z axis=1.
Dlaczego moje przypisanie nie zmienia DataFrame'u?
Od pandas 3 Copy-on-Write sprawia, że każdy wybór zachowuje się jak kopia. Przypisanie łańcuchowe, takie jak df["age"][0] = 37, zmienia tymczasowy obiekt i nie rusza df. Zapisz to jako jedno wywołanie loc: df.loc[0, "age"] = 37. Metody takie jak dropna i fillna też zwracają nowy obiekt, więc przypisz wynik.
Czy mogę uruchomić kod pandas online?
Tak. Darmowy Matplotlib playground uruchamia Pythona z pandas, NumPy, Matplotlib i scikit-learn w przeglądarce, więc możesz wkleić dowolny fragment z tej ściągi i uruchomić go bez instalowania czegokolwiek. Kurs Machine Learning w Coddy uczy pandas krok po kroku, od pierwszego DataFrame'u po dane, które zasilają model.
Ilustracja języków programowania w Coddy

Naucz się języka Pandas z Coddy

ZACZNIJ