Содержание статьи
Во всех строках import pandas as pd, import numpy as np; df — таблица, s — Series.
| Задача |
Код |
| таблица из словаря |
pd.DataFrame({"a": [1, 2], "b": [3, 4]}) |
| из списка записей |
pd.DataFrame([{"a": 1}, {"a": 2}]) |
| прочитать CSV |
pd.read_csv("f.csv", sep=",", parse_dates=["date"]) |
| CSV из русского Excel |
pd.read_csv("f.csv", sep=";", decimal=",", encoding="cp1251") |
| Excel, Parquet |
pd.read_excel("f.xlsx", sheet_name=None), pd.read_parquet("f.parquet") → форматы |
| записать |
df.to_csv("f.csv", index=False), df.to_parquet("f.parquet") |
| Задача |
Код |
| первые строки, размер |
df.head(), df.shape |
| типы и пропуски |
df.info(), df.dtypes, df.isna().sum() |
| статистика |
df.describe(), df.describe(include="all") |
| частоты |
s.value_counts(normalize=True, dropna=False) |
| число различных |
df.nunique() |
| Задача |
Код |
| столбец, несколько |
df["a"], df[["a", "b"]] |
| по метке / позиции |
df.loc["x", "a"], df.iloc[0, 1] |
| по условию |
df[df["a"] > 0], df[(df["a"] > 0) & (df["b"] == "x")] |
| значение из списка, диапазон |
df[df["a"].isin([1, 2])], df[df["a"].between(1, 5)] |
| условие строкой |
df.query("a > @limit") |
| изменить по условию |
df.loc[df["a"] < 0, "a"] = 0 |
| Задача |
Код |
| новый столбец |
df["c"] = df["a"] * df["b"], df.assign(c=pd.col("a") * 2) |
| переименовать, удалить |
df.rename(columns={"a": "x"}), df.drop(columns=["b"]) |
| сортировать |
df.sort_values(["a", "b"], ascending=[True, False]) |
| n наибольших |
df.nlargest(5, "a") |
| заменить значения |
s.replace({"old": "new"}) → replace |
| по условию |
s.where(s > 0, 0), s.mask(s > 100, 100), s.clip(0, 100) → where |
| словарём, функцией |
s.map({"a": 1}), s.map(func) → map, apply |
| дубликаты |
df.drop_duplicates(subset=["a"], keep="last") → дубликаты |
| Задача |
Код |
| заполнить, удалить пропуски |
df.fillna({"a": 0}), df.ffill(), df.dropna(subset=["a"]) |
| строку в число |
pd.to_numeric(s, errors="coerce") |
| целые с пропусками |
s.astype("Int64") |
| категория |
s.astype("category") → category |
| текст |
s.str.strip().str.lower(), s.str.contains("x", regex=False) → строки |
| даты |
pd.to_datetime(s, format="%d.%m.%Y"), s.dt.month, s.dt.day_name() → даты |
| интервалы |
pd.cut(s, bins=[0, 18, 65, 100]), pd.qcut(s, 4) → cut |
Группировка и сводные → groupby, agg
| Задача |
Код |
| итог по группам |
df.groupby("g")["a"].sum() |
| несколько итогов с именами |
df.groupby("g").agg(total=("a", "sum"), n=("a", "size")) |
| ключи столбцами |
df.groupby("g", as_index=False)["a"].sum() |
| значение группы в каждой строке |
df.groupby("g")["a"].transform("mean") → transform |
| ранг в группе |
df.groupby("g")["a"].rank(method="min") → rank |
| сводная таблица |
df.pivot_table(values="a", index="g", columns="h", aggfunc="sum", fill_value=0) → pivot_table |
| таблица частот |
pd.crosstab(df["g"], df["h"], normalize="index") |
Форма и объединение → melt, merge
| Задача |
Код |
| широкий → длинный |
df.melt(id_vars="id", var_name="month", value_name="v") |
| длинный → широкий |
df.pivot(index="id", columns="month", values="v") |
| уровень в столбцы |
s.unstack(fill_value=0) → stack |
| списки в строки |
df.assign(t=df["t"].str.split(", ")).explode("t") → explode |
| склеить строки |
pd.concat([df1, df2], ignore_index=True) → concat |
| соединить по ключу |
df1.merge(df2, on="id", how="left", validate="many_to_one") |
| ключи с разными именами |
df1.merge(df2, left_on="a", right_on="b") → ключи |
| Задача |
Код |
| столбец в индекс и обратно |
df.set_index("id"), df.reset_index(drop=True) |
| последовательность дат |
pd.date_range("2024-01-01", periods=12, freq="ME") |
| выбор по месяцу |
s.loc["2024-03"] |
| предыдущее значение, прирост |
s.shift(), s.diff(), s.pct_change() → shift |
| скользящее среднее |
s.rolling(7).mean(), s.rolling("7D").mean() → rolling |
| по дням / месяцам |
s.resample("D").sum(), s.resample("ME").mean() → resample |
| Задача |
Код |
| в словарь / список записей |
df.to_dict(), df.to_dict("records") |
| в массив NumPy |
df.to_numpy() |
| график |
df.plot(), df.plot.bar(), s.plot.hist(bins=20) |
| показать все строки |
pd.set_option("display.max_rows", None) → отображение |