- REF: Шпаргалка по Pandas
- Работа с файлами
- Сводная информация
- Доступ к элементам
- Логическая индексация
- Изменение таблиц
- Добавление строк и колонок
- Неопределённые ячейки
- Вычисления в таблицах
- Агрегированная информация
- Группы
- Агрегация групп
- Использование справочников
- Работа со строковыми данными
- Работа с временем
- Получение имени столбцов в Pandas DataFrame
- Пример 1: как распечатать?
- Пример 2: с помощью индекса
- Пример 3: с использованием цикла For Loop
- Как получить список всех имен столбцов в Pandas (методы 4)
- Способ 1: Используйте скобки
- Способ 2: Используйте tolist()
- Способ 3: использовать список()
- Способ 4: используйте list() со значениями столбца
- Дополнительные ресурсы
REF: Шпаргалка по Pandas
В pandas есть два основных объекта: DataFrame (таблица) и Series (последовательность значений, например, один столбец DataFrame). У таблицы есть ключи (индексы) строчек — index и колонок — columns. По умолчанию index целочисленный. Индексы строк не обязаны быть уникальными. При их совпадении, обращение к индексу df.loc[row] вернёт таблицу с несколькими строками.
Принципиальная разница с массивами numpy в том, что колонки pandas DataFrame могут быть различного типа (в том числе экземплярами класса). Таблицу можно транспонировать df.T и в этом смысле особой разницы между строками и колонками нет. Но если колонки различного типа транспонирование превратит все типы в object.
import pandas as pd df = pd.DataFrame() # создаём пустую таблицу print(df.index, df.columns) # Index( [] ) Index([]) df = pd.DataFrame([1,3,2], # одна колонка из 3-х чисел с именем A columns=['A']) # индексы строчек по умолчанию [0,1,2] print(df.index) # RangeIndex(start=0,stop=3,step=1) print(df.columns) # Index(['A']) df = pd.DataFrame() # тоже самое df['A'] = [1,2,3] # создаём колонку в пустой таблице df = pd.DataFrame([[1,2], # таблица из 2D массива [3,4]]) # первая строка [1,2], вторая [3,4]
Таблицу можно задать при помощи словаря (его ключи — имена колонок). Если у ключа скалярное значение — оно будет продублировано. При задании ключей строчек (index) можно смешивать str, int, Timestamp и т.п.:
cat = pd.Categorical(["a","b","a"])> # категориальные (не строки!) df = pd.DataFrame(Список словарей - это список строк. Каждый новый ключ порождает колонку:
# | b c a pd.DataFrame([< 'b': 1, 'c': 2>, # ---------------- ]) # 0 | 1 2 NaN # 1 | 3 4 5df1 = df.copy() # deepcopy таблицыРабота с файлами
При загрузке из csv-файла можно (index_col) задать некоторую колонку (по имени или по номеру) как индексную (имена строчек):
df = pd.read_csv("name.csv", index_col="id")chunksize = 10 ** 6 with pd.read_csv(filename, chunksize=chunksize) as reader: for chunk in reader: process(chunk)df.to_csv("submission.csv", index=False) # без сохранения индекса df.to_csv('probs.zip', index=False, # запаковать в zip-файл compression=dict(method='zip', archive_name='probs.csv') )Сводная информация
print('shape:', df.shape) # вывод формы (rows, cols) display(df) # распечатать (если не последняя команда) df.head(7) # 7 первых строк (5 по умолчанию) df.tail(2) # 2 последние строки (5 по умолчанию) df.sample(2) # 2 случайные строки df.describe() # статистики по всем колонкам df.col.describe() # статистики колонке c именем 'col' df.describe(include=[bool])) # только логические колонки (bool,float,object,category) df.col.mean() # среднее значение по колонке 'col' df.col.unique() # список уникальных значений df.col.value_counts() # таблица имя значения - число раз в 'col' df.info() # список колонок с типами и непустых данных df.duplicated().sum() # число дубликатов строк df.isna().sum() # вывод числа пропусков в каждой колонкеpd.set_option('display.float_format', lambda x: '%.2f' % x)Доступ к элементам
Метод at даёт доступ к элементам таблицы, а метод loc - к срезам по индексам (строк и колонок). Тоже самое для iat, iloc, но индексация при помощи номеров строк и колонок (целые числа, срезы подобно numpy). Для loc срезы включают границы, а для iloc срезы понимаются в обычном для Python смысле (верхняя граница не включена).
Свойство at[rowID, colID] быстрее, чем loc[rowID, colID] для одного элемена:
Свойство loc позволяет извлечь одну строку, список строк или их срез, а также срез таблицы (index, columns). При этом в срезе последний индекс включается (!):
df.loc[ 0 ] # Series (0-я строка) df.loc[ 0 ] = 5 # присвоить всем элементам строки 0 значение 5 df.loc[ [1,3] ] # DataFrame с 2-я строками df.loc[ :2] # DataFrame c 3-я строками df.loc[0, 'a'] # аналогично at, но медленнее df.loc[1:3, 'a'] # результат - Series (3 элемента) df.a.loc[1:3] # тоже самое (можно и со строковыми индексами) df.loc[1:3, ['a','b']] # DataFrame (срез 3 строки, 2 колонки) df.loc[[1,3], ['a','b']] # DataFrame (вырез 2 строки, 2 колонки)Получение колонок: df['col_name'] - это даёт Series. Тот-же эффект: df.col_name (если колонка уже существует). Можно список имён колонок: df[['a','c']] - тогда это DataFrame, а не Series.
df['a'] = 5 # изменить все значения в колонке 5 df.a = 5 # тоже самое df['a'] = [1,2,3] # элементы колонки (должна совпадать с другими колонками)Логическая индексация
df.loc[ df.a > 1 ] # DataFrame в которой значения в кллонке a > 1 df.loc[ (df.a > 1) & (df.a < 5) ] df.loc[df.c.isin(['aa','bb'])] # присутствуют значения в колонке 'c' df.loc[df.isin(['aa','bb'])] # присутствуют значения в любой колонке df.loc[lambda df: df.a == 8] # отобрать строки, удовлетворящие функции df[df >0] # все элементы большие нуля (остальные NaN) df[df > 0] = -dfИзменение таблиц
df = df.sort_values(by="A") # сортировки по колонкам df = df.sort_values(by=["A", "B"]) df = df.sort_index(axis=1, ascending=False) # сортировка колонок df = df.sort_index(axis=0) # сортировка индексов строк (один типа!)Переименование колонок и индексов строк:
df.rename(columns = ) df.rename(index = )Добавление строк и колонок
df = pd.DataFrame() # | a b # ---------- df.loc[len(df.index)] = [3, -3] # 0 | 1 -1 # 1 | 2 -2 da = pd.DataFrame([]) # 2 | 3 -3 df = pd.concat([df, da]) # 3 | 4 -4 df = df.reset_index() # сделать снова индексы строк уникальными (!)df["len"] = df["name"].map(lambda x: len(x))Неопределённые ячейки
Некоторые ячейки могут быть неопределёнными (None или np.nan), что при выводе отражается как NaN. Метод isna возвращает DataFrame с логическими значениями (его антипод notna):
df = pd.DataFrame() # | a b # --------------- # 0 | False False df.isna() # 1 | False TrueМожно создавать таблицу с неопределёнными ячейками (для порождения больших таблиц эффективнее создать сначала неопределённую, и затем её заполнять, чем добавлять строки). Значениями в ячейках могут быть объекты (списки и т.п.).
df = pd.DataFrame(index=range(2), # | a columns=['a']) # -------- df.at[0,'a'] = [1,2] # 0 | [1,2] df # 1 | NaNdf.dropna(how="any") # выкинуть все строки с пропусками df.fillna(value=5) # заполнить одним значениемВычисления в таблицах
df['c']= df.a + df.b # создаём новую колонку или меняем существующую df.a = df.a.map(lambda x: x - 50) # меняем колонку при помощи функции
count | количество не-NA объектов |
---|---|
sum | cумма |
mean | cреднее значение |
mad | cреднее абсолютное отклонение |
median | медиана |
min | минимум |
max | максимум |
mode | мода |
abs | абсолютное значение |
prod | произведение |
std | стандартное отклонение |
var | несмещенная дисперсия |
sem | стандартная ошибка среднего |
skew | скошенность (момент 3-го порядка) |
kurt | эксцесс (момент 4-го порядка) |
quantile | квантиль (%) |
cumsum | кумулятивная сумма |
cumprod | кумулятивное произведение |
cummax | кумулятивный максимум |
cummin | кумулятивный минимум |
Агрегированная информация
Вместо стандартной describe, можно самостоятельно формировать итоговые таблицы по колонкам (текстовые имена для функций панды df.sum и т.п.), иначе просто имя функции:
def fun(x): return sum(x)**0.5 fun.__name__ = 'sqrt' # можно для вывода любое имя df.agg(['sum', 'mean', 'std', max, strange])
Группы
Сгруппируем одинаковые значения в колонке A и пробежимся по всем группам (каждая группа - это DataFrame):
groups = df.groupby("A") # val=a # | A B X Y for val_A, df_A in groups: # -------------- print("val norm">index.name='A'):# | X Y df.groupby("A").sum() # A ------- # a | 4 1 # b | 11 1 df.groupby("A").X.sum() # получить Series сумм в группах для колонки XСначала сгруппировать по A, затем по B:
# | X Y df.groupby(["A","B"]).sum() # A B |----- # a 0 | 4 1 # b 0 | 5 0 # 1 6 | 1Теперь индекс - это не одно число а пара чисел:
MultiIndex([('a', '0'), ('b', '0'), ('b', '1')], names=['A', 'B'])Агрегация групп
Создание таблицы в которой колонка sess уникальна, а все aid собраны в множество (второй пример - с переименованием колонки "set" → "s1" "min" → "mi"):
df.groupby('s').i.agg([set, min]) # s set min # 0 1 df.groupby('s').agg(s1=('i',set), mi=('i',min)) # 1 1 # 2 2gr0 = df[df.t==0].groupby('s').agg(s1=('i',set)) # s s1 s2 gr1 = df[df.t==1].groupby('s').agg(s2=('i',set)) # 0 # 1 pd.concat([gr0, gr1], axis=1) # 2 NaNИспользование справочников
Связывание таблиц подобно SQL (df_ref - таблица справочник даёт свои значения в таблицу df по ключу i):
df_ref = pd.DataFrame(<'i':[0, 1, 3, 4], # | i v s 'v':[10,20,30,40], # ---------------- 's':['a','b','c','d']>) # 0 | 0 10 a # 1 | 0 10 a df = pd.DataFrame() # 2 | 1 20 b # 3 | 3 30 c df.merge(df_ref, on='i', how="left") # 4 | 2 NaN NaNdf.merge(df_ref, left_on='i1', right_on='i', how="left")Работа со строковыми данными
s.str.lower() s.str.lower().str.strip()Работа с временем
ts = pd.Timestamp('2022-11-13 00:00:00', tz=None) ts.to_pydatetime() # datetime.datetime(2022, 11, 13, 0, 0) rng = pd.date_range('2022-11-13', periods=3, freq='D') rng.to_pydatetime() # list 3-х datetimeЕсли дата-время в csv сохранена Unix timestamp (seconds passed since 1970-1-1) то их можно конвертировать:
df = pd.DataFrame() # 2022-07-31 22:01:44 df.date = pd.to_datetime(df.date, unit='s') # D,s,ms,us,nst1 = pd.to_datetime(df.ts.min(), unit='s') t2 = pd.to_datetime(df.ts.max(), unit='s') print(t1, t2, pd.Timedelta(t2 - t1) )df.time = pd.to_datetime(df.date, unit='s') # D,s,ms,us,ns df['hour'] = df.time.dt.hour # номер часа df['weekday'] = df.time.dt.weekday # номер дня неделиПолучение имени столбцов в Pandas DataFrame
Чтобы получить имена столбцов DataFrame, используйте свойство DataFrame.columns.
Синтаксис для использования свойства columns в DataFrame:
Свойство columns возвращает объект типа Index. Мы могли получить доступ к отдельным именам, используя любую технику цикла в Python.
Пример 1: как распечатать?
В этом примере мы получим имена столбцов DataFrame и распечатаем их.
import pandas as pd #initialize a dataframe df = pd.DataFrame( [['Amol', 72, 67, 91], ['Lini', 78, 69, 87], ['Kiku', 74, 56, 88], ['Ajit', 54, 76, 78]], columns=['name', 'physics', 'chemistry', 'algebra']) #get the dataframe columns cols = df.columns #print the columns print(cols)Index(['name', 'physics', 'chemistry', 'algebra'], dtype='object')Пример 2: с помощью индекса
Вы можете получить доступ к отдельным именам столбцов с помощью индекса.
import pandas as pd #initialize a dataframe df = pd.DataFrame( [['Amol', 72, 67, 91], ['Lini', 78, 69, 87], ['Kiku', 74, 56, 88], ['Ajit', 54, 76, 78]], columns=['name', 'physics', 'chemistry', 'algebra']) #get the dataframe columns cols = df.columns #print the columns for i in range(len(cols)): print(cols[i])name physics chemistry algebraПример 3: с использованием цикла For Loop
Вы можете использовать цикл for для перебора столбцов DataFrame.
import pandas as pd #initialize a dataframe df = pd.DataFrame( [['Amol', 72, 67, 91], ['Lini', 78, 69, 87], ['Kiku', 74, 56, 88], ['Ajit', 54, 76, 78]], columns=['name', 'physics', 'chemistry', 'algebra']) #get the dataframe columns cols = df.columns #print the columns for column in cols: print(column)name physics chemistry algebraВ этом руководстве по Pandas мы извлекли имена столбцов из DataFrame с помощью свойства DataFrame.column.
Как получить список всех имен столбцов в Pandas (методы 4)
Вы можете использовать один из следующих четырех методов, чтобы перечислить все имена столбцов фрейма данных pandas:
Способ 1: Используйте скобки
Способ 2: Используйте tolist()
Способ 3: использовать список()
Способ 4: используйте list() со значениями столбца
В следующих примерах показано, как использовать каждый из этих методов со следующими пандами DataFrame:
import pandas as pd #create DataFrame df = pd.DataFrame() #view DataFrame df points assists rebounds blocks 0 25 5 11 6 1 12 7 8 6 2 15 7 10 3 3 14 9 6 2 4 19 12 6 7 5 23 9 5 9
Способ 1: Используйте скобки
В следующем коде показано, как перечислить все имена столбцов кадра данных pandas с помощью квадратных скобок:
[column for column in df] ['points', 'assists', 'rebounds', 'blocks']
Способ 2: Используйте tolist()
В следующем коде показано, как получить список всех имен столбцов с помощью функции .tolist() :
df.columns.values.tolist () ['points', 'assists', 'rebounds', 'blocks']
Способ 3: использовать список()
В следующем коде показано, как получить список всех имен столбцов с помощью функции list() :
list(df) ['points', 'assists', 'rebounds', 'blocks']
Способ 4: используйте list() со значениями столбца
В следующем коде показано, как перечислить все имена столбцов с помощью функции list() со значениями столбцов:
list(df.columns.values ) ['points', 'assists', 'rebounds', 'blocks']
Обратите внимание, что все четыре метода возвращают одинаковые результаты.
Обратите внимание, что для очень больших фреймов данных метод df.columns.values.tolist() работает быстрее всего.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные функции со столбцами кадра данных pandas: