pd.DataFrame
Contents
pd.DataFrame¶
pd.DataFrame
— по сути дела таблица, на которую можно смотреть как на объединение столбцов pd.Series
с выравниванием по общему индексу.
Можно изменять содержимое ячеек таблицы, добавление новых строк — дорогостоящая операция (пересоздание таблицы), но добавление столбцов осуществляется на месте.
Создание таблицы¶
Есть множество способов создать датафрейм из уже существующих объектов python.
Один самых удобных — используя словари.
Если ключи в словаре соответствуют именам столбцов, а значения — списки, NumPy
массивы, pandas
серии данных этих столбцов, то используется конструктор pd.DataFrame
. При этом если в значениях присутствуют объекты pd.Series
, то индекс созданного датафрейма будет объединением индексов серий, а данные всех столбцов выравниваются по меткам этого индекса.
import pandas as pd
import numpy as np
col1 = pd.Series([1, 2], index=["a", "b"])
col2 = pd.Series([3, 4], index=["b", "a"])
col3 = pd.Series([5, 6, 7], index=["a", "b", "c"])
d = {
'col1': col1,
'col2': col2,
'col3': col3,
}
df = pd.DataFrame(d)
df
col1 | col2 | col3 | |
---|---|---|---|
a | 1.0 | 4.0 | 5 |
b | 2.0 | 3.0 | 6 |
c | NaN | NaN | 7 |
Если значения в словаре списки или массивы, то они должны быть одной длинны. В созданной таблице данные в столбцах идут в том же порядке, что и в исходных списках/массивах (без выравнивания), что и в списках. Индекс созданной таблицы по умолчанию — RangeIndex
, но можно явно указать его при создании опциональным параметром index
.
col1 = np.array([1, 2])
col2 = [3, 4]
d = {
"col1": col1,
"col2": col2
}
df = pd.DataFrame(d, index=["a", "b"])
df
col1 | col2 | |
---|---|---|
a | 1 | 3 |
b | 2 | 4 |
pd.DataFrame.form_dict — более специализированный метод для создания датафрейма из словаря. В предыдущих двух примерах он сработал бы аналогично, но его имя длиннее. Его преимущество заключается, например, в том, что он позволяет создать датафрейм из словаря, в котором ключи — метки строк (индекс), а значения — строки будущей таблицы.
Для этого необходимо указать в качестве параметра orient
строку index
. Далее все аналогично. Если строки представлены в виде pd.Series
, то метки попадут в названия столбцов с выравниванием данных. Если это простые массивы, то имена столбцов — RangeIndex
, но можно явно указать имена столбцов по параметру columns
.
row1 = pd.Series([1, 2], index=["a", "b"])
row2 = pd.Series([3, 4], index=["b", "a"])
d = {
"row1": row1,
"row2": row2,
}
pd.DataFrame.from_dict(d, orient="index")
a | b | |
---|---|---|
row1 | 1 | 2 |
row2 | 4 | 3 |
Если данные представлены в виде какой-то двухмерной структуры, в которой отсутствуют метки и строк и столбцов, то можно воспользоваться методом pd.DataFrame
, при этом индекс и имена столбцов можно указать соответствующими параметрами index
и columns
.
data = [
[1, 2],
[3, 4],
[5, 6]
]
pd.DataFrame(data, index=["row1", "row2", "row3"], columns=["col1", "col2"])
col1 | col2 | |
---|---|---|
row1 | 1 | 2 |
row2 | 3 | 4 |
row3 | 5 | 6 |
Хранение и чтение таблиц¶
Для хранения таблиц чаще всего используются
Гораздо чаще датафрейм получается, как результат чтение таблицы из файла. Чаще всего такие таблицы хранятся в формате csv или в форматах таблиц excel
.
Строка таблицы соответствует строке текста, которая содержит одно или несколько полей, разделенных запятыми.
brand,mpg,cyl,disp,hp,drat,wt,qsec,vs,am,gear,carb
Mazda RX4,21.0,6,160.0,110,3.9,2.62,16.46,0,1,4,4
Mazda RX4 Wag,21.0,6,160.0,110,3.9,2.875,17.02,0,1,4,4
Datsun 710,22.8,4,108.0,93,3.85,2.32,18.61,1,1,4,1
Hornet 4 Drive,21.4,6,258.0,110,3.08,3.215,19.44,1,0,3,1
Hornet Sportabout,18.7,8,360.0,175,3.15,3.44,17.02,0,0,3,2
Valiant,18.1,6,225.0,105,2.76,3.46,20.22,1,0,3,1
Duster 360,14.3,8,360.0,245,3.21,3.57,15.84,0,0,3,4
Merc 240D,24.4,4,146.7,62,3.69,3.19,20.0,1,0,4,2
Merc 230,22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2
Merc 280,19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4
Merc 280C,17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4
Merc 450SE,16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3
Merc 450SL,17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3
Merc 450SLC,15.2,8,275.8,180,3.07,3.78,18.0,0,0,3,3
Cadillac Fleetwood,10.4,8,472.0,205,2.93,5.25,17.98,0,0,3,4
Lincoln Continental,10.4,8,460.0,215,3.0,5.424,17.82,0,0,3,4
Chrysler Imperial,14.7,8,440.0,230,3.23,5.345,17.42,0,0,3,4
Fiat 128,32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1
Honda Civic,30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2
Toyota Corolla,33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1
Toyota Corona,21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1
Dodge Challenger,15.5,8,318.0,150,2.76,3.52,16.87,0,0,3,2
AMC Javelin,15.2,8,304.0,150,3.15,3.435,17.3,0,0,3,2
Camaro Z28,13.3,8,350.0,245,3.73,3.84,15.41,0,0,3,4
Pontiac Firebird,19.2,8,400.0,175,3.08,3.845,17.05,0,0,3,2
Fiat X1-9,27.3,4,79.0,66,4.08,1.935,18.9,1,1,4,1
Porsche 914-2,26.0,4,120.3,91,4.43,2.14,16.7,0,1,5,2
Lotus Europa,30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2
Ford Pantera L,15.8,8,351.0,264,4.22,3.17,14.5,0,1,5,4
Ferrari Dino,19.7,6,145.0,175,3.62,2.77,15.5,0,1,5,6
Maserati Bora,15.0,8,301.0,335,3.54,3.57,14.6,0,1,5,8
Volvo 142E,,,,,,,,,,,
Пример простейшего csv
файла приведен выше. В этом примере первая строка выступает в качестве заголовка, т.е. в ней перечислены названия столбцов, разделенные запятыми. Далее в каждой строке приведены значения этих столбцов, разделенные запятыми. В последней строке пропущены значения всех столбцов, кроме первого (brand).
Предположим, что текстовый файл с таким содержимым хранится в папке data
под именем mtcars.csv
. Для чтения такой таблицы используется метод read_csv.
import os
path = os.path.join("data", "mtcars.csv")
df = pd.read_csv(path)
print(df.info())
df.head()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32 entries, 0 to 31
Data columns (total 12 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 brand 32 non-null object
1 mpg 31 non-null float64
2 cyl 31 non-null float64
3 disp 31 non-null float64
4 hp 31 non-null float64
5 drat 31 non-null float64
6 wt 31 non-null float64
7 qsec 31 non-null float64
8 vs 31 non-null float64
9 am 31 non-null float64
10 gear 31 non-null float64
11 carb 31 non-null float64
dtypes: float64(11), object(1)
memory usage: 3.1+ KB
None
brand | mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 |
1 | Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 |
2 | Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 |
3 | Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 |
4 | Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 |
В самом простом варианте использования функции read_csv
имена столбцов распознаются из первой строки файла (параметром
header
можно повлиять на это);в качестве индекса генерируется
RangeIndex
(параметромindex_col
можно выбрать столбец индекса);в качестве разделителя ожидается символ запятой (
,
) (параметромsep
можно на это повлиять);пропущенные значения заполняются
np.nan
;столбцы с датами не распознаются.
Note
Метод DataFrame.head возвращает первые n
строк таблицы. По умолчанию n
равно 5, но можно указать явно. Похожий по смыслу метод DataFrame.tail возвращает последние n
строк.
Метод DataFrame.info печатает информацию о таблице. В частности, из вывода этой функции можно понять количество строк и столбцов, тип индекса таблицы, имя каждого столбца, тип данных и количество непропущенных значений в них.
Считаем эту таблицу ещё раз, указав в этот раз в качестве индекса столбец brand
.
df = pd.read_csv(path, index_col="brand", sep=",")
df
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
brand | |||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 |
Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 |
Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 |
Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 |
Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 |
Valiant | 18.1 | 6.0 | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 |
Duster 360 | 14.3 | 8.0 | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 |
Merc 240D | 24.4 | 4.0 | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 |
Merc 230 | 22.8 | 4.0 | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 |
Merc 280 | 19.2 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 |
Merc 280C | 17.8 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 |
Merc 450SE | 16.4 | 8.0 | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 |
Merc 450SL | 17.3 | 8.0 | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 |
Merc 450SLC | 15.2 | 8.0 | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 |
Cadillac Fleetwood | 10.4 | 8.0 | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 |
Lincoln Continental | 10.4 | 8.0 | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 |
Chrysler Imperial | 14.7 | 8.0 | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 |
Fiat 128 | 32.4 | 4.0 | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 |
Honda Civic | 30.4 | 4.0 | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 |
Toyota Corolla | 33.9 | 4.0 | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 |
Toyota Corona | 21.5 | 4.0 | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 |
Dodge Challenger | 15.5 | 8.0 | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 |
AMC Javelin | 15.2 | 8.0 | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 |
Camaro Z28 | 13.3 | 8.0 | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 |
Pontiac Firebird | 19.2 | 8.0 | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 |
Fiat X1-9 | 27.3 | 4.0 | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 |
Porsche 914-2 | 26.0 | 4.0 | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 |
Ford Pantera L | 15.8 | 8.0 | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 |
Ferrari Dino | 19.7 | 6.0 | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 |
Maserati Bora | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 |
Volvo 142E | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Аналогично можно считывать данные из таблиц excel
методом read_excel.
Методами to_csv и to_excel можно сохранить DataFrame
в таблицу удобном формате (для сохранения в excel
необходимо поставить библиотеку openpyxl или её аналоги).
Индексация DataFrame¶
Доступ к строкам DataFrame
осуществляется в точности, как осуществляется доступ к элементам Series
, т.е. используются методы loc
и iloc
, которые сразу возвращают строку в виде объекта pd.Series
, у которого в качестве индекса выступают имена столбцов.
df.loc["Volvo 142E"]
mpg NaN
cyl NaN
disp NaN
hp NaN
drat NaN
wt NaN
qsec NaN
vs NaN
am NaN
gear NaN
carb NaN
Name: Volvo 142E, dtype: float64
Оператор []
датафрейма предназначен для выбора столбцов. Передавать в него можно имя нужного столбца или список таких имен. Результат в первом случае — столбец в виде pd.Series
, а во втором случае — таблица pd.DataFrame
из указанных столбцов.
df["mpg"].head()
brand
Mazda RX4 21.0
Mazda RX4 Wag 21.0
Datsun 710 22.8
Hornet 4 Drive 21.4
Hornet Sportabout 18.7
Name: mpg, dtype: float64
df[["cyl", "wt"]].tail()
cyl | wt | |
---|---|---|
brand | ||
Lotus Europa | 4.0 | 1.513 |
Ford Pantera L | 8.0 | 3.170 |
Ferrari Dino | 6.0 | 2.770 |
Maserati Bora | 8.0 | 3.570 |
Volvo 142E | NaN | NaN |
Если в названии столбца нет пробелов, то можно обращаться к столбцу, как к атрибуту объекта.
df.carb.head(3)
brand
Mazda RX4 4.0
Mazda RX4 Wag 4.0
Datsun 710 1.0
Name: carb, dtype: float64
Методы DataFrame.at и DataFrame.iat позволяют получить одно значение на пересечении строки и столбца.
df.iat[0, 0]
21.0
Добавление столбцов¶
Добавление и изменение столбцов в таблицу похоже на добавление элементов в словарь. При этом, если добавляется столбец с индексом (pd.Series
), то данные автоматически выравниваются.
Пусть поступили данные о стоимости автомобилей определенной марки.
price = pd.Series({
"Mazda RX4": 100_000,
"Lotus Europa": 120_000
})
df["price"] = price
df
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
brand | ||||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 |
Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | NaN |
Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 | NaN |
Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 | NaN |
Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 | NaN |
Valiant | 18.1 | 6.0 | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 | NaN |
Duster 360 | 14.3 | 8.0 | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 | NaN |
Merc 240D | 24.4 | 4.0 | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 | NaN |
Merc 230 | 22.8 | 4.0 | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 | NaN |
Merc 280 | 19.2 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 | NaN |
Merc 280C | 17.8 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 | NaN |
Merc 450SE | 16.4 | 8.0 | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 | NaN |
Merc 450SL | 17.3 | 8.0 | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 | NaN |
Merc 450SLC | 15.2 | 8.0 | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 | NaN |
Cadillac Fleetwood | 10.4 | 8.0 | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 | NaN |
Lincoln Continental | 10.4 | 8.0 | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 | NaN |
Chrysler Imperial | 14.7 | 8.0 | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 | NaN |
Fiat 128 | 32.4 | 4.0 | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 | NaN |
Honda Civic | 30.4 | 4.0 | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 | NaN |
Toyota Corolla | 33.9 | 4.0 | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN |
Toyota Corona | 21.5 | 4.0 | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 | NaN |
Dodge Challenger | 15.5 | 8.0 | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 | NaN |
AMC Javelin | 15.2 | 8.0 | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 | NaN |
Camaro Z28 | 13.3 | 8.0 | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 | NaN |
Pontiac Firebird | 19.2 | 8.0 | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 | NaN |
Fiat X1-9 | 27.3 | 4.0 | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN |
Porsche 914-2 | 26.0 | 4.0 | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 | NaN |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.0 |
Ford Pantera L | 15.8 | 8.0 | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 | NaN |
Ferrari Dino | 19.7 | 6.0 | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 | NaN |
Maserati Bora | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | NaN |
Volvo 142E | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
Пропущенные значения¶
Большинство методов pandas
разработаны таким образом, чтобы обрабатывать пропущенные значения.
df.mean()
mpg 20.048387
cyl 6.258065
disp 234.261290
hp 147.903226
drat 3.580000
wt 3.231355
qsec 17.824516
vs 0.419355
am 0.387097
gear 3.677419
carb 2.838710
price 110000.000000
dtype: float64
Тем не менее иногда необходимо избавиться от строк или столбцов с пропущенными данными. Для этого удобно использовать метод DataFrame.dropna, который возвращает новую таблицу, состоящую из строк исходной таблицы, не содержащих np.nan
.
df.dropna()
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
brand | ||||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.0 |
Параметром axis
можно выбрать, отбрасывать ли строки или столбцы. Параметр how
может быть равен или all
или any
(по умолчанию any
) и в зависимости от этого отбрасываются те строки таблицы (столбцы), в которых пропущены все или хотя бы одно значения.
Вместо того чтобы отбросить пропущенные значения, методом df.fillna можно их заполнить. В самом простом варианте он заполняет na
во всех столбцах одним и тем же значением (по умолчанию не на месте).
df.fillna(0)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
brand | ||||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 |
Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | 0.0 |
Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 | 0.0 |
Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 | 0.0 |
Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 | 0.0 |
Valiant | 18.1 | 6.0 | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 | 0.0 |
Duster 360 | 14.3 | 8.0 | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 | 0.0 |
Merc 240D | 24.4 | 4.0 | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 | 0.0 |
Merc 230 | 22.8 | 4.0 | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 | 0.0 |
Merc 280 | 19.2 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 | 0.0 |
Merc 280C | 17.8 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 | 0.0 |
Merc 450SE | 16.4 | 8.0 | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 | 0.0 |
Merc 450SL | 17.3 | 8.0 | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 | 0.0 |
Merc 450SLC | 15.2 | 8.0 | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 | 0.0 |
Cadillac Fleetwood | 10.4 | 8.0 | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 | 0.0 |
Lincoln Continental | 10.4 | 8.0 | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 | 0.0 |
Chrysler Imperial | 14.7 | 8.0 | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 | 0.0 |
Fiat 128 | 32.4 | 4.0 | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 | 0.0 |
Honda Civic | 30.4 | 4.0 | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 | 0.0 |
Toyota Corolla | 33.9 | 4.0 | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 | 0.0 |
Toyota Corona | 21.5 | 4.0 | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 | 0.0 |
Dodge Challenger | 15.5 | 8.0 | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 | 0.0 |
AMC Javelin | 15.2 | 8.0 | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 | 0.0 |
Camaro Z28 | 13.3 | 8.0 | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 | 0.0 |
Pontiac Firebird | 19.2 | 8.0 | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 | 0.0 |
Fiat X1-9 | 27.3 | 4.0 | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 | 0.0 |
Porsche 914-2 | 26.0 | 4.0 | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 | 0.0 |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.0 |
Ford Pantera L | 15.8 | 8.0 | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 | 0.0 |
Ferrari Dino | 19.7 | 6.0 | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 | 0.0 |
Maserati Bora | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | 0.0 |
Volvo 142E | 0.0 | 0.0 | 0.0 | 0.0 | 0.00 | 0.000 | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
Можно настроить более гибкое заполнение. Например, передавая словарь, можно выбрать свой заполнитель для каждого столбца. А параметром method
можно заполнять пропущенные значения ближайшим непропущенным в строчках выше или ниже.
Методом DataFrame.interpolate можно заполнить пропущенные значения интерполируя по непропущенным.
df.interpolate(method="linear")
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
brand | ||||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.000000 |
Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | 100740.740741 |
Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 | 101481.481481 |
Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 | 102222.222222 |
Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 | 102962.962963 |
Valiant | 18.1 | 6.0 | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 | 103703.703704 |
Duster 360 | 14.3 | 8.0 | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 | 104444.444444 |
Merc 240D | 24.4 | 4.0 | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 | 105185.185185 |
Merc 230 | 22.8 | 4.0 | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 | 105925.925926 |
Merc 280 | 19.2 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 | 106666.666667 |
Merc 280C | 17.8 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 | 107407.407407 |
Merc 450SE | 16.4 | 8.0 | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 | 108148.148148 |
Merc 450SL | 17.3 | 8.0 | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 | 108888.888889 |
Merc 450SLC | 15.2 | 8.0 | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 | 109629.629630 |
Cadillac Fleetwood | 10.4 | 8.0 | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 | 110370.370370 |
Lincoln Continental | 10.4 | 8.0 | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 | 111111.111111 |
Chrysler Imperial | 14.7 | 8.0 | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 | 111851.851852 |
Fiat 128 | 32.4 | 4.0 | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 | 112592.592593 |
Honda Civic | 30.4 | 4.0 | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 | 113333.333333 |
Toyota Corolla | 33.9 | 4.0 | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 | 114074.074074 |
Toyota Corona | 21.5 | 4.0 | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 | 114814.814815 |
Dodge Challenger | 15.5 | 8.0 | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 | 115555.555556 |
AMC Javelin | 15.2 | 8.0 | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 | 116296.296296 |
Camaro Z28 | 13.3 | 8.0 | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 | 117037.037037 |
Pontiac Firebird | 19.2 | 8.0 | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 | 117777.777778 |
Fiat X1-9 | 27.3 | 4.0 | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 | 118518.518519 |
Porsche 914-2 | 26.0 | 4.0 | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 | 119259.259259 |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.000000 |
Ford Pantera L | 15.8 | 8.0 | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 | 120000.000000 |
Ferrari Dino | 19.7 | 6.0 | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 | 120000.000000 |
Maserati Bora | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | 120000.000000 |
Volvo 142E | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | 120000.000000 |
apply, map, applymap¶
Применить некоторую функцию к всем строкам/столбцам таблицы можно методом DataFrame.apply. Передавать этому методу необходимо такую функцию, рассчитывая, что ей на вход будет подаваться объект pd.series
, который в зависимости от значения параметра axis
будет или строкой или столбцом таблицы.
def f(x):
return x.max() - x.min()
df.apply(f, axis="rows").head()
mpg 23.50
cyl 4.00
disp 400.90
hp 283.00
drat 2.17
dtype: float64
Метод Series.map позволяет применить функцию к каждому значению столбца. Чтобы продемонстрировать принцип работы этого метода, извлечем из столбца brand
марку и модель автомобиля в разные столбцы.
Для этого определим функции, которые в качестве аргумента принимают строку из столбца brand
и возвращают марку или модель автомобиля из неё. В данной таблице, марка автомобиля всегда встречается до первого пробела, а модель автомобиля — все после первого пробела.
def get_brand(x):
return x.split(" ")[0]
def get_model(x):
b, *m = x.split(" ") # все после первого пробела попадает в переменную m
return " ".join(m)
x = "Mazda RX4 Wag"
print(f"{x} -> {get_brand(x)} and {get_model(x)}")
Mazda RX4 Wag -> Mazda and RX4 Wag
Определив эти функции применим их к столбцу brand
. Т.к. brand
— индекс, то создадим из него pd.Series
, применим определенные функции методом map
и запишем результаты в таблицу в качестве новых столбцов.
fullname = pd.Series(df.index, index=df.index)
df.index.rename("car", inplace=True)
df["brand"] = fullname.map(get_brand)
df["model"] = fullname.map(get_model)
df
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | brand | model | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
car | ||||||||||||||
Mazda RX4 | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 | Mazda | RX4 |
Mazda RX4 Wag | 21.0 | 6.0 | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | NaN | Mazda | RX4 Wag |
Datsun 710 | 22.8 | 4.0 | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Datsun | 710 |
Hornet 4 Drive | 21.4 | 6.0 | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Hornet | 4 Drive |
Hornet Sportabout | 18.7 | 8.0 | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Hornet | Sportabout |
Valiant | 18.1 | 6.0 | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Valiant | |
Duster 360 | 14.3 | 8.0 | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Duster | 360 |
Merc 240D | 24.4 | 4.0 | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 | NaN | Merc | 240D |
Merc 230 | 22.8 | 4.0 | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 | NaN | Merc | 230 |
Merc 280 | 19.2 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 | NaN | Merc | 280 |
Merc 280C | 17.8 | 6.0 | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 | NaN | Merc | 280C |
Merc 450SE | 16.4 | 8.0 | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SE |
Merc 450SL | 17.3 | 8.0 | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SL |
Merc 450SLC | 15.2 | 8.0 | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SLC |
Cadillac Fleetwood | 10.4 | 8.0 | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Cadillac | Fleetwood |
Lincoln Continental | 10.4 | 8.0 | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Lincoln | Continental |
Chrysler Imperial | 14.7 | 8.0 | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Chrysler | Imperial |
Fiat 128 | 32.4 | 4.0 | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Fiat | 128 |
Honda Civic | 30.4 | 4.0 | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 | NaN | Honda | Civic |
Toyota Corolla | 33.9 | 4.0 | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Toyota | Corolla |
Toyota Corona | 21.5 | 4.0 | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Toyota | Corona |
Dodge Challenger | 15.5 | 8.0 | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Dodge | Challenger |
AMC Javelin | 15.2 | 8.0 | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | AMC | Javelin |
Camaro Z28 | 13.3 | 8.0 | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Camaro | Z28 |
Pontiac Firebird | 19.2 | 8.0 | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Pontiac | Firebird |
Fiat X1-9 | 27.3 | 4.0 | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Fiat | X1-9 |
Porsche 914-2 | 26.0 | 4.0 | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 | NaN | Porsche | 914-2 |
Lotus Europa | 30.4 | 4.0 | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.0 | Lotus | Europa |
Ford Pantera L | 15.8 | 8.0 | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 | NaN | Ford | Pantera L |
Ferrari Dino | 19.7 | 6.0 | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 | NaN | Ferrari | Dino |
Maserati Bora | 15.0 | 8.0 | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | NaN | Maserati | Bora |
Volvo 142E | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | Volvo | 142E |
Вместо функции, методу map
можно передать словарь.
n2str = {
4.0: "four",
6.0: "six",
8.0: "eight"
}
df["cyl"] = df["cyl"].map(n2str)
df
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | brand | model | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
car | ||||||||||||||
Mazda RX4 | 21.0 | six | 160.0 | 110.0 | 3.90 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 | Mazda | RX4 |
Mazda RX4 Wag | 21.0 | six | 160.0 | 110.0 | 3.90 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | NaN | Mazda | RX4 Wag |
Datsun 710 | 22.8 | four | 108.0 | 93.0 | 3.85 | 2.320 | 18.61 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Datsun | 710 |
Hornet 4 Drive | 21.4 | six | 258.0 | 110.0 | 3.08 | 3.215 | 19.44 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Hornet | 4 Drive |
Hornet Sportabout | 18.7 | eight | 360.0 | 175.0 | 3.15 | 3.440 | 17.02 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Hornet | Sportabout |
Valiant | 18.1 | six | 225.0 | 105.0 | 2.76 | 3.460 | 20.22 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Valiant | |
Duster 360 | 14.3 | eight | 360.0 | 245.0 | 3.21 | 3.570 | 15.84 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Duster | 360 |
Merc 240D | 24.4 | four | 146.7 | 62.0 | 3.69 | 3.190 | 20.00 | 1.0 | 0.0 | 4.0 | 2.0 | NaN | Merc | 240D |
Merc 230 | 22.8 | four | 140.8 | 95.0 | 3.92 | 3.150 | 22.90 | 1.0 | 0.0 | 4.0 | 2.0 | NaN | Merc | 230 |
Merc 280 | 19.2 | six | 167.6 | 123.0 | 3.92 | 3.440 | 18.30 | 1.0 | 0.0 | 4.0 | 4.0 | NaN | Merc | 280 |
Merc 280C | 17.8 | six | 167.6 | 123.0 | 3.92 | 3.440 | 18.90 | 1.0 | 0.0 | 4.0 | 4.0 | NaN | Merc | 280C |
Merc 450SE | 16.4 | eight | 275.8 | 180.0 | 3.07 | 4.070 | 17.40 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SE |
Merc 450SL | 17.3 | eight | 275.8 | 180.0 | 3.07 | 3.730 | 17.60 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SL |
Merc 450SLC | 15.2 | eight | 275.8 | 180.0 | 3.07 | 3.780 | 18.00 | 0.0 | 0.0 | 3.0 | 3.0 | NaN | Merc | 450SLC |
Cadillac Fleetwood | 10.4 | eight | 472.0 | 205.0 | 2.93 | 5.250 | 17.98 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Cadillac | Fleetwood |
Lincoln Continental | 10.4 | eight | 460.0 | 215.0 | 3.00 | 5.424 | 17.82 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Lincoln | Continental |
Chrysler Imperial | 14.7 | eight | 440.0 | 230.0 | 3.23 | 5.345 | 17.42 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Chrysler | Imperial |
Fiat 128 | 32.4 | four | 78.7 | 66.0 | 4.08 | 2.200 | 19.47 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Fiat | 128 |
Honda Civic | 30.4 | four | 75.7 | 52.0 | 4.93 | 1.615 | 18.52 | 1.0 | 1.0 | 4.0 | 2.0 | NaN | Honda | Civic |
Toyota Corolla | 33.9 | four | 71.1 | 65.0 | 4.22 | 1.835 | 19.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Toyota | Corolla |
Toyota Corona | 21.5 | four | 120.1 | 97.0 | 3.70 | 2.465 | 20.01 | 1.0 | 0.0 | 3.0 | 1.0 | NaN | Toyota | Corona |
Dodge Challenger | 15.5 | eight | 318.0 | 150.0 | 2.76 | 3.520 | 16.87 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Dodge | Challenger |
AMC Javelin | 15.2 | eight | 304.0 | 150.0 | 3.15 | 3.435 | 17.30 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | AMC | Javelin |
Camaro Z28 | 13.3 | eight | 350.0 | 245.0 | 3.73 | 3.840 | 15.41 | 0.0 | 0.0 | 3.0 | 4.0 | NaN | Camaro | Z28 |
Pontiac Firebird | 19.2 | eight | 400.0 | 175.0 | 3.08 | 3.845 | 17.05 | 0.0 | 0.0 | 3.0 | 2.0 | NaN | Pontiac | Firebird |
Fiat X1-9 | 27.3 | four | 79.0 | 66.0 | 4.08 | 1.935 | 18.90 | 1.0 | 1.0 | 4.0 | 1.0 | NaN | Fiat | X1-9 |
Porsche 914-2 | 26.0 | four | 120.3 | 91.0 | 4.43 | 2.140 | 16.70 | 0.0 | 1.0 | 5.0 | 2.0 | NaN | Porsche | 914-2 |
Lotus Europa | 30.4 | four | 95.1 | 113.0 | 3.77 | 1.513 | 16.90 | 1.0 | 1.0 | 5.0 | 2.0 | 120000.0 | Lotus | Europa |
Ford Pantera L | 15.8 | eight | 351.0 | 264.0 | 4.22 | 3.170 | 14.50 | 0.0 | 1.0 | 5.0 | 4.0 | NaN | Ford | Pantera L |
Ferrari Dino | 19.7 | six | 145.0 | 175.0 | 3.62 | 2.770 | 15.50 | 0.0 | 1.0 | 5.0 | 6.0 | NaN | Ferrari | Dino |
Maserati Bora | 15.0 | eight | 301.0 | 335.0 | 3.54 | 3.570 | 14.60 | 0.0 | 1.0 | 5.0 | 8.0 | NaN | Maserati | Bora |
Volvo 142E | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | Volvo | 142E |
Warning
Использовать числа с плавающей точкой в качестве ключей словаря считается плохой практикой из-за особенностей их представления в компьютере: даже минимальное отклонение от точного значения ключа в словаре может привести (и почти наверняка приведет) к другому значению хэш-функции и получить искомое значение по “испорченному ключу не выйдет”.
Метод DataFrame.applymap применяет функцию к кажому значению в таблице.
Группировка по значениям столбца¶
Часто необходимо сгруппировать строки таблицы по какому-то принципу и с каждой из групп проделать какие-то операции. За группировку в pandas
отвечает метод DataFrame.groupby. В качестве аргумента её можно передать имя столбца, по значениям которого необходима группировка (можно также передать несколько столбцов в списке).
grouped = df.groupby("brand")
grouped.get_group("Mazda")
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | price | brand | model | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
car | ||||||||||||||
Mazda RX4 | 21.0 | six | 160.0 | 110.0 | 3.9 | 2.620 | 16.46 | 0.0 | 1.0 | 4.0 | 4.0 | 100000.0 | Mazda | RX4 |
Mazda RX4 Wag | 21.0 | six | 160.0 | 110.0 | 3.9 | 2.875 | 17.02 | 0.0 | 1.0 | 4.0 | 4.0 | NaN | Mazda | RX4 Wag |
Каждую группу можно рассматривать как мини-таблицу. Часто таблицу группируют по значениям одного столбца, чтобы потом посчитать какие-нибудь агрегирующие функцию к значениям других столбцов. Сделать это можно методом DataFrameGroupBy.aggregate.
grouped["mpg"].aggregate(["min", "mean", "max", "count"])
min | mean | max | count | |
---|---|---|---|---|
brand | ||||
AMC | 15.2 | 15.200000 | 15.2 | 1 |
Cadillac | 10.4 | 10.400000 | 10.4 | 1 |
Camaro | 13.3 | 13.300000 | 13.3 | 1 |
Chrysler | 14.7 | 14.700000 | 14.7 | 1 |
Datsun | 22.8 | 22.800000 | 22.8 | 1 |
Dodge | 15.5 | 15.500000 | 15.5 | 1 |
Duster | 14.3 | 14.300000 | 14.3 | 1 |
Ferrari | 19.7 | 19.700000 | 19.7 | 1 |
Fiat | 27.3 | 29.850000 | 32.4 | 2 |
Ford | 15.8 | 15.800000 | 15.8 | 1 |
Honda | 30.4 | 30.400000 | 30.4 | 1 |
Hornet | 18.7 | 20.050000 | 21.4 | 2 |
Lincoln | 10.4 | 10.400000 | 10.4 | 1 |
Lotus | 30.4 | 30.400000 | 30.4 | 1 |
Maserati | 15.0 | 15.000000 | 15.0 | 1 |
Mazda | 21.0 | 21.000000 | 21.0 | 2 |
Merc | 15.2 | 19.014286 | 24.4 | 7 |
Pontiac | 19.2 | 19.200000 | 19.2 | 1 |
Porsche | 26.0 | 26.000000 | 26.0 | 1 |
Toyota | 21.5 | 27.700000 | 33.9 | 2 |
Valiant | 18.1 | 18.100000 | 18.1 | 1 |
Volvo | NaN | NaN | NaN | 0 |