Операции с датафреймами/сериями

Математические функции и статистика

В панде уже реализовано множество математических функций для работы с данными, уже сохраненными в соответствующей структуре данных. Весь их список стоит посмотреть по ссылкам на общей странице (раздел «Внешняя документация») Рассмотрим некоторые из них.

Функция mean() без параметра (0 или столбцы подразумевается по-умолчанию) вычисляет среднее значение для каждого столбца датафрейма

df.mean()

Если указать параметр 1, то вычислено будет среднее значение по строке

df.mean(1)

abs() - берет модуль от каждого элемента

count() - считает количество существующих (которые не равны NaN) элементов

max()/min() - находят максимум и минимум

sum()/prod() - сумма или произведение

Применение функции к элементам структуры

С помощью функции apply() можно применить заданную функцию ко всей структуре сразу.

Например, создадим следующий датафрейм

df = pd.DataFrame([[4, 9],] * 3, columns=['A', 'B'])

A B
0 4 9
1 4 9
2 4 9

Извлечем корень из каждого элемента таблицы

df.apply(np.sqrt) # здесь мы пользуемся функцией квадратного корня из библиотеки numpy, обратите внимание, что в этом контексте скобки не нужны

A B
0 2.0 3.0
1 2.0 3.0
2 2.0 3.0

Функцию можно применить и ко всему столбцу

df.apply(np.sum, axis=0)

или строке

df.apply(np.sum, axis=1)

Слияние

Конкатенация

Группировка

Группировкой будем считать один или несколько следующих шагов:

Разделение данных на группы по какому-нибудь критерию

Применение функции независимо к каждой группе

Комбинирование результатов в общую структуру

Посмотрим на примеры:

Создадим датафрейм

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)}) print(df)

A B C D
0 foo one -1.202872 -0.055224
1 bar one -1.814470 2.395985
2 foo two 1.018601 1.552825
3 bar three -0.595447 0.166599
4 foo two 1.395433 0.047609
5 bar two -0.392670 -0.136473
6 foo one 0.007207 -0.561757
7 foo three 1.928123 -1.623033

Сгруппируем данные по первому столбцу и найдем сумму элементов в каждой группе

df.groupby('A').sum() print(df)

Обратите внимание, что в результате отсутствует столбец B, так как операция суммирования к нему неприменима

C D
A
bar -2.802588 2.42611
foo 3.146492 -0.63958

Группировать можно и иерархически, например указав два стобца

df.groupby(['A','B']).sum() print(df)

C D
A B
bar one -1.814470 2.395985
three -0.595447 0.166599
two -0.392670 -0.136473
foo one -1.195665 -0.616981
three 1.928123 -1.623033
two 2.414034 1.600434