Дата последнего обновления: 2019/9/23
Краткое введение в новую строку и обработку времени
Заполнение отсутствующих значений, удаление, чтение и запись раздела excel сделано небольшое дополнение
Глава 4 добавляет методы для использования итераторов строк-столбцов.
Глава 5 добавляет методы установки, сброса и переименования индексов.
Третья глава дополняет справочный список основных операторов и соответствующих функций, вычислений сдвига и разности.
pandas
основан наnumpy
Библиотека анализа данных предоставляет несколько более простых в использовании моделей данных и большое количество эффективных статистических методов.
Импортируйте модуль перед его использованием:
import pandas as pd
При необходимости импортируйте следующие модули:
import numpy as np
import matplotlib.pyplot as plt
Нажмите на ссылки ниже, чтобы перейти к каждому разделу
Руководство пользователя 2 — Типы данных и преобразования (Типы данных, преобразования типов)
Руководство пользователя 6. Сортировка и дедупликация (прямая и косвенная сортировка, дедупликация)
Руководство пользователя 7. Перемешивание и выборка (случайная сортировка, выборка)
Руководство пользователя 10. Обработка специальных типов (строка, время)
1. Модель данных и свойства
1. ИндексIndex
В numpy есть только индексы позиций, в то время как панды также добавляют индексы меток, полагаясь на выделенныйIndex
тип.
обычный индекс
pd.Index([1,2,3])
Out[64]: Int64Index([1, 2, 3], dtype='int64')
pd.Index([1.,2.,3.])
Out[65]: Float64Index([1.0, 2.0, 3.0], dtype='float64')
pd.Index(['a','b','c'])
Out[66]: Index(['a', 'b', 'c'], dtype='object')
pd.Index(range(10))
Out[67]: RangeIndex(start=0, stop=10, step=1)
pd.Index(range(10)).values
Out[68]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
import datetime as dt
dt1=dt.datetime.now()
dt2=dt1+dt.timedelta(days=1)
pd.Index([dt1,dt2])
Out[81]: DatetimeIndex(['2019-03-09 20:56:14.644159', '2019-03-10 20:56:14.644159'], dtype='datetime64[ns]', freq=None)
Index
Конкретный тип индекса будет автоматически сгенерирован в соответствии с входящими данными (одномерная последовательность) при его создании.dtype
Параметр задает тип, но будет выдано сообщение об ошибке, если он не может быть преобразован нормально;copy
Параметр указывает, копировать ли исходные данные при создании индекса, по умолчаниюfalse
.
Определенные типы индексов также можно создавать с помощью собственных методов.Index.values
Одномерные массивы, лежащие в основе данных, можно просматривать,Index.dtype
Типы данных можно просматривать.
многоуровневый индекс
pandas предоставляет многоуровневые индексы для облегчения группировки данных, которые можно использовать для создания многомерных наборов данных,groupby
Расчеты также автоматически генерируют многоуровневые индексы.
midx=pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[1,1,0,0],[0,1,0,1]],name=['idx1','idx2'])
midx
Out[6]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
midx.set_labels([1,0,1,0],level=1)
Out[9]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [1, 0, 1, 0]],
names=['idx1', 'idx2'])
midx.swaplevel(0,1)
Out[11]:
MultiIndex(levels=[['c', 'd'], ['a', 'b']],
labels=[[0, 1, 0, 1], [1, 1, 0, 0]],
names=['idx2', 'idx1'])
pd.MultiIndex.from_arrays([['a','a','b','b'],['c','d','c','d']],names=['idx1','idx2'])
Out[12]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
MultiIndex
первый параметрlevels
список уникальных меток для каждого уровня, представляющий собой двухуровневую вложенную последовательность, внешний слой соответствует уровню, а внутренний слой соответствует уникальной метке;
второй параметрlabels
Это номер метки всех записей, выбранных на каждом уровне, а также двухуровневая вложенная последовательность, внешний слой соответствует уровню, а внутренний слой соответствует записи.codes
подстановка параметров;
четвертый параметрnames
имя каждого уровня.
MultiIndex
Предоставляются некоторые вспомогательные методы,set_levels
,set_labels
,set_names
Вы можете установить свойство индекса всего или определенного уровня, черезlevel
Параметр задает уровень, а значением по умолчанию является общий;swaplevel
уровни можно менять местами,droplevel
Уровни можно удалить,sortlevel
Указанный уровень можно сортировать;from_array
,from_tuples
,from_product
,from_frame
методы для создания индексов из данных в других структурах.
2. Последовательность данныхSeries
s=pd.Series([1,2,3,4],name='s1')
s
Out[100]:
0 1
1 2
2 3
3 4
Name: s1, dtype: int64
pd.Series([[1,2],[3,4]],index=['row1','row2'])
Out[101]:
row1 [1, 2]
row2 [3, 4]
dtype: object
s.dtype
Out[102]: dtype('int64')
s.name
Out[103]: 's1'
s.values
Out[104]: array([1, 2, 3, 4], dtype=int64)
s.index
Out[105]: RangeIndex(start=0, stop=4, step=1)
s.shape
Out[106]: (4,)
Одна из основных моделей данных, по названию последовательностиname
, индекс меткиindex
, массив значений (одномерный)values
сочинение. Используется для хранения одномерных данных, есть только одно направление оси: 0,shape
Свойства, чтобы увидеть форму набора данных.
При создании могут быть получены только одномерные данные последовательности (список, кортеж, ndarray).Для тех, у которых более одного измерения, последнее измерение будет считаться измерением элемента, а тип будет определяться автоматически в соответствии с поступающие данные.dtype
Спецификация отображения параметров.
По умолчанию создается индекс диапазона, доступ к которому можно получить черезindex
Параметр задает одномерную последовательность в качестве индекса или может быть создан непосредственно какindex
уступка имущества.
3. Фрейм данныхDataFrame
df=pd.DataFrame([[1,'a'],[2,'b']],columns=['col1','col2'])
df
Out[108]:
col1 col2
0 1 a
1 2 b
df.dtypes
Out[113]:
col1 int64
col2 object
dtype: object
df.index
Out[114]: Int64Index([1, 2], dtype='int64', name='col1')
df.columns
Out[116]: Index(['col1', 'col2'], dtype='object')
df.values
Out[117]:
array([[1, 'a'],
[2, 'b']], dtype=object)
df.col2
Out[125]:
col1
1 a
2 b
Name: col2, dtype: object
pd.DataFrame({'col1':[1,3],'col2':['a','b']})
Out[126]:
col1 col2
0 1 a
1 3 b
df.shape
Out[127]: (2, 2)
Вторая базовая модель данных, таблица данных, индексируется по меткам столбцов.columns
, индекс метки строкиindex
, массив значений (двумерный)values
сочинение. Используется для хранения двумерных данных, есть два направления оси: 0 и 1, соответствующие координатам строки и координатам столбца,shape
Свойства, чтобы увидеть форму набора данных. Доступ к данным столбца можно получить с помощью того же имени атрибута, что и имя столбца, доступного только в том случае, если определено строковое имя столбца, один столбец являетсяSeries
.
При создании могут быть получены только двумерные данные последовательности (список, кортеж, ndarray), если размерность превышает две размерности, то последняя размерность будет считаться размерностью элемента, а тип будет определяться автоматически в соответствии с входящие данные.dtype
Параметры указываются явно, в отличие от numpy,DataFrame
Столбцы могут определять различные типы данных посредством автоматической оценки при создании или типы преобразования после фильтрации столбцов.DataFrame.dtypes
свойство для просмотра типа данных всех столбцов. По сравнению с numpy, пандыDataFrame
Создание также добавляет кdict
поддержка источников данных,key
соответствующее имя столбца,value
Соответствующие данные столбца.
По умолчанию создается индекс диапазона, доступ к которому можно получить черезindex
Параметр задает одномерную последовательность в качестве индекса или может быть создан непосредственно какindex
присвоение атрибутов,DataFrame.set_index
Метод может вернуть копию фрейма данных с замененным индексом, не затрагивая исходные данные.
DataFrame
эквивалентноSeries
стек, вдольDataFrame
нарезка шириной 1 в направлении строки или столбца, результатом будетSeries
.
Изначально панды также предоставляли трехмерную модель данных.Panel
, но в новой версии от него отказались, можно попробовать использовать многоуровневый индексMultiIndex
для построения многомерных наборов данных.
4. Категориальные данныеCategorical
pandas предоставляет категориальный тип данных для ограничения таких данных, который ограничивает значение категориальных меток и предоставляет критерии сортировки для категориальных меток.
pd.Categorical(['a','b','b','c'],categories=['a','b'],ordered=True)
Out[14]:
[a, b, b, NaN]
Categories (2, object): [a < b]
pd.Categorical(['a','b','b','c'])
Out[15]:
[a, b, b, c]
Categories (3, object): [a, b, c]
первый параметрvalues
— последовательность всех классификационных меток;
второй параметрcategories
представляет собой последовательность уникальных меток классификации, когда указан этот параметр,values
не принадлежитcategories
будет заменен наNaN
, если не указано, то будет основываться наvalues
Автоматически генерируется;
третий параметрordered
Объявите, указывает ли уникальная классификационная метка метод упорядочивания, какTrue
будет нажиматьcategories
Порядок в метке масштабирует отношение размера, по умолчаниюFalse
.
2. Типы данных и преобразования
1. Тип данных
Тип данных, поддерживаемый pandas, — это тип данных numpy, который также можно передавать при создании модели данных.dtype
спецификация параметра.
Обычно используемые типы данных:np.bool_
(bool),np.int64
(int),np.float64
(float),np.datetime64
(datetime),object
(ул и др.),pd.Categorical
(категория).
Более подробное описание типов см. в руководстве по использованию numpy.
В отличие от numpy, в numpyint
Введите значение по умолчаниюnp.int32
, в то время как по умолчанию в пандахnp.int64
; Строка хранения в numpy предпочтительно имеет фиксированную длинуnp.str_
, в то время как pandas используется единообразноobject
.
модель данных pandas использует одинndarray
В качестве основных данных, поэтому, когда каждый столбец pandas использует разные типы данных, источник данныхndarray
В целом установлено наobject
тип данных.
2. Преобразование типов
df=pd.DataFrame([[1,'2'],[3,'a']],columns=['col1','col2'])
df.dtypes
Out[49]:
col1 int64
col2 object
dtype: object
df.col1.astype('float')
Out[50]:
0 1.0
1 3.0
Name: col1, dtype: float64
pd.to_numeric(df.col2,errors='ignore')
Out[52]:
0 2
1 a
Name: col2, dtype: object
pd.to_numeric(df.col2,errors='coerce')
Out[53]:
0 2.0
1 NaN
Name: col2, dtype: float64
панды и numpy в основном используютсяastype
Выполнить преобразование типов. Этот метод возвращает преобразованные данные. Когда исходные данные необходимо изменить, возвращаемое значение можно использовать для перезаписи исходных данных.
Когда вам нужно выполнить некоторые преобразования, которые могут завершиться неудачно, рассмотрите возможность использования специальных методов, например.pd.to_numeric
для размещенияSeries
преобразовать в числовой тип,errors
Параметры могут указывать, как обрабатывать ошибки:'coerce'
Указывает на принудительное преобразование, и элементы, которые не могут быть преобразованы, будут заменены наNaN
;'ignore'
Указывает, что преобразование будет отменено, если есть элементы, которые невозможно преобразовать.
при необходимостиDataFrame
При применении преобразования в целом можно использоватьapply
метод.
3. Массивы и статистические операции
1. Основные операции и скалярные функции
Pandas перегружает большинство операторов Python и может напрямую выполнять вычисления массива. Также можно напрямую использовать скалярные функции значений Numpy. Эти операции расширяют операции, первоначально примененные к одному элементу, на весь массив.
df=pd.DataFrame([[1,'2'],[3,'a']],columns=['col1','col2'])
df+df
Out[57]:
col1 col2
0 2 22
1 6 aa
np.sqrt(df.col1)
Out[201]:
0 1.000000
1 1.732051
Name: col1, dtype: float64
Используемые операторы и функции должны быть осмысленными для всех типов данных, задействованных в операции, иначе будет сообщено об ошибке.
метод сопоставления
s1=pd.Series([1,2,3,4],index=[0,1,2,3])
s2=pd.Series([5,6,7,8],index=[1,2,3,4])
s1+s2
Out[156]:
0 NaN
1 7.0
2 9.0
3 11.0
4 NaN
dtype: float64
Необходимо обратить внимание на разницу между pandas и numpy.Операция массива pandas основана на индексе метки в сопоставлении элементов, и позиция, которая не соответствует, будет заменена на NaN, а numpy основана на индексе позиции .
Основные операторы и соответствующие функции
оператор | соответствующая функция | инструкция |
---|---|---|
+ | add | добавить |
- | sub | вычесть |
* | mul | умножить |
/ | div | разделять |
// | floordiv | Делимый |
% | mod | остаток |
** | pow | Экспоненциальная мощность |
== | eq | равный |
!= | ne | диапазон |
>= | ge | больше или равно |
<= | le | меньше или равно |
> | gt | больше, чем |
< | lt | меньше, чем |
~ | - | побитовое отрицание |
& | - | побитовое И |
| | - | побитовое ИЛИ |
^ | - | Побитовое исключающее ИЛИ |
Логическая операция модели данных pandas не может использовать не и, или, но должна использовать ~, &, |;
Операторы смещения > также недоступны в модели данных pandas.
2. Статистические методы
Агрегатная функция
pandas наследует функции агрегации numpy:sum
,mean
,max
,min
Ждать.
доступныйSeries
иDataFrame
вызов метода или вызов статического метода в numpy.
df.sum()
Out[58]:
col1 4
col2 2a
dtype: object
np.max(df)
Out[60]:
col1 3
col2 a
dtype: object
df.agg({'col1':'max','col2':'sum'})
Out[114]:
col1 3
col2 2a
dtype: object
df.agg(['max','sum'])
Out[115]:
col1 col2
max 3 a
sum 4 2a
При вызове через метод модели данных pandas
первый параметрaxis
Можно указать ось статистики,Series
Нет смысла указывать этот параметр,DataFrame
По умолчанию считается по оси 0, то есть по столбцу. панды не могут указать развернуть статистику по всем осям, при необходимости можно использовать метод numpy;
второй параметрskipna
Может указать, следует ли пропуститьNaN
ценность;
третий параметрlevel
Он используется для указания определенного уровня индекса для статистики при наличии многоуровневого индекса;
четвертый параметрnumeric_only
Используется, чтобы указать, следует ли применять вычисления только к числам.
когда правильноDataFrame
При подсчете в направлении строки, поскольку типы данных разных столбцов могут быть разными, необходимо следить за тем, чтобы соответствующие операции были осмысленными, иначе ожидаемые результаты не могут быть получены.
agg
путьaggregate
Сокращение метода, используемое для применения различных функций агрегирования или нескольких функций агрегирования к разным столбцам, которые могут быть переданы вlist
илиdict
Объявите статистику.
Статистика группы
pandas предоставляет sql-подобныйgroupby
метод используется для групповой статистики.
df=pd.DataFrame([['a','c',1],['a','d',2],['b','d',3]],columns=['col1','col2','col3'])
In [89]: df
Out[89]:
col1 col2 col3
0 a c 1
1 a d 2
2 b d 3
result=df.groupby(by=['col1','col2']).agg(['max','min'])
result
Out[94]:
col3
max min
col1 col2
a c 1 1
d 2 2
b d 3 3
result.sum(level=0)
Out[95]:
col3
max min
col1
a 3 3
b 3 3
gb=df.groupby(by=['col1','col2'])
gb.groups
Out[141]:
{('a', 'c'): Int64Index([0], dtype='int64'),
('a', 'd'): Int64Index([1], dtype='int64'),
('b', 'd'): Int64Index([2], dtype='int64')}
gb.get_group(('a','c'))
Out[142]:
col1 col2 col3
0 a c 1
просто позвониgroupby
метод получитDataFrameGroupBy
объект, через которыйgroups
способ просмотра всей информации о группировке,get_group
метод для получения указанной группы.
Этот объект может вызывать различные агрегатные функции или вызыватьagg
Метод выполняет составную агрегированную статистику и возвращает многоуровневый индекс.DataFrame
Статистическая таблица результатов, для таблицы результатов вы можете продолжать применять статистические функции и проходитьlevel
Параметр указывает уровень индекса для вторичной статистики.
Расчет сдвига и разницы
При анализе данных может возникнуть необходимость вычислить величину изменения между соседними записями.Метод сдвига можно использовать для реализации сдвига и вычитания записей, или метод diff можно использовать напрямую.
s=pd.Series([1,2,3,4])
s
Out[28]:
0 1
1 2
2 3
3 4
dtype: int64
s.shift()
Out[29]:
0 NaN
1 1.0
2 2.0
3 3.0
dtype: float64
s.shift(periods=2)
Out[32]:
0 NaN
1 NaN
2 1.0
3 2.0
dtype: float64
s-s.shift()
Out[30]:
0 NaN
1 1.0
2 1.0
3 1.0
dtype: float64
s.diff()
Out[33]:
0 NaN
1 1.0
2 1.0
3 1.0
dtype: float64
s.pct_change()
Out[34]:
0 NaN
1 1.000000
2 0.500000
3 0.333333
dtype: float64
Метод сдвига используется для сдвига данных в указанном направлении, метод diff используется для расчета величины изменения при указанном смещении, а метод pct_change используется для расчета скорости изменения при указанном смещении. Параметр Periods указывает величину смещения, значение по умолчанию равно 1, ось указывает направление оси, а значение по умолчанию равно 0.
3. Применить пользовательскую функцию
В дополнение к функциям, предоставляемым pandas и numpy, вы также можете настраивать функции и использоватьapply
,applymap
,map
Метод быстро применяется ко всему набору данных.
df.apply(lambda x: x.col1+x.col2, axis=1)
Out[119]:
0 3
1 7
dtype: int64
def add(row):
return row.col1+row.col2
df.apply(add, axis=1)
Out[121]:
0 3
1 7
dtype: int64
df.applymap(lambda x: x*2)
Out[122]:
col1 col2
0 2 4
1 6 8
def double(item):
return item*2
df.applymap(double)
Out[124]:
col1 col2
0 2 4
1 6 8
s=pd.Series(['a','b','b'])
s.map(lambda x: x*2)
Out[129]:
0 aa
1 bb
2 bb
dtype: object
s.map({'a':'c','b':'d'})
Out[130]:
0 c
1 d
2 d
dtype: object
DataFrame
имеютapply
иapplymap
Два метода:apply
применить функцию к каждой строке или столбцу,axis
Параметр задает направление оси применяемой функции. Значение 0 означает, что применяется по столбцам, то есть рассчитывается по столбцам как параметр функции. Значение 1 означает, что применяется по строкам , а значение по умолчанию — 0;applymap
Примените функцию к каждому элементу.
Series
только одинmap
метод, который используется для применения функции к элементу, в дополнение к предоставлению функции сопоставления значений, входdict
При использовании типа соответствующее значение будет заменено в соответствии с сопоставлением ключ-значение.
Поддержка анонимных лямбда-функций.
4. Трансляция
l2=[1,2]
a2=np.array(l2)
s2=pd.Series(l2)
df21=pd.DataFrame([1,2])
df12=pd.DataFrame([[1,2]])
l22=[[1,2],[3,4]]
a22=np.array(l22)
df22=pd.DataFrame(l22)
df23=pd.DataFrame([[3,4,5],[6,7,8]])
df22+l2
Out[99]:
0 1
0 2 4
1 4 6
df22+a2
Out[100]:
0 1
0 2 4
1 4 6
df22+s2
Out[101]:
0 1
0 2 4
1 4 6
df22+df21
Out[102]:
0 1
0 2 NaN
1 5 NaN
df22+df12
Out[103]:
0 1
0 2.0 4.0
1 NaN NaN
df23+s2
Out[104]:
0 1 2
0 4.0 6.0 NaN
1 7.0 9.0 NaN
df21+df12
Out[130]:
0 1
0 2.0 NaN
1 NaN NaN
Механизм вещания панд унаследован от numpy, но есть отличия:
Скалярное значение будет таким же, какDataFrame
илиSeries
Такой же расчет выполняется для каждого элемента в ;
Series
или одномерныйlist
или одномерныйndarray
будет сDataFrame
для работы с каждой строкой ,Series
недостаточно долго, чтобы соответствоватьDataFrame
Отсутствующая часть строки заменяется наNaN
, два других типа длин недостаточны, и будет сообщено об ошибке;
DataFrame
иDataFrame
Операция будет сопоставляться поэлементно, независимо от строки и столбца, часть с недостаточной длиной будет заменена наNaN
;
двухмерныйndarray
иDataFrame
Операция следует правилам вещания numpy, и ось, длина которой меньше 1, будет транслироваться на тот же размер;list
иDataFrame
операции не поддерживаются.
4. Запрос и ассоциация
1. Поиск по индексу
(1) Формат индексатора
Выбор одного значения:[value,...]
Выбор нескольких значений:[[value1,value2],...]
Выбор диапазона:[start:end:step,...]
start
Указывает начало интервала, значение по умолчанию 0,end
Указывает на конец интервала (исключительно), значение по умолчанию равно длине оси,step
Указывает выбранный размер шага, значение по умолчанию равно 1, параметры со значением по умолчанию можно не указывать,[:,...]
Указывает на все выборки в соответствующем направлении оси.
Формат индексаторов в pandas похож на numpy, но использование другое. В дополнение к индексу позиции numpy, pandas также добавляет индекс метки, хотя его можно использовать дляSeries
иDataFrame
Используйте индексатор напрямую, но использование строго ограничено, вместо него рекомендуется использоватьiloc
иloc
метод для индексации.
(2) Прямой индекс
df=pd.DataFrame(np.arange(1,10).reshape((3,3)),columns=['col1','col2','col3'],index=['row1','row2','row3'])
df[0:3:2]
Out[158]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
df['row1':'row3':2]
Out[161]:
col1 col2 col3
row1 1 2 3
row3 7 8 9
df['col2']
Out[162]:
row1 2
row2 5
row3 8
Name: col2, dtype: int32
df[['col1','col3']]
Out[163]:
col1 col3
row1 1 3
row2 4 6
row3 7 9
df['col2'][1:3]
Out[168]:
row2 5
row3 8
Name: col2, dtype: int32
Прямое индексирование имеет ограниченное количество применений: нарезка индекса по положению строки, нарезка индекса по метке строки, выборка столбца по метке столбца, выборка нескольких столбцов по списку меток столбца, фильтрация строк по логическому индексу, фильтрация элементов по индексу Sol и т. д. . Индексатор может одновременно использовать только один метод и не может работать одновременно со строками и столбцами.При необходимости может выполняться непрерывное индексирование.
(3) loc и индекс iloc
df.loc['row1','col1']
Out[169]: 1
df.loc['row1':'row3':2,'col1':'col3':2]
Out[170]:
col1 col3
row1 1 3
row3 7 9
df.iloc[0,0]
Out[185]: 1
df.iloc[0:3:2,0:3:2]
Out[186]:
col1 col3
row1 1 3
row3 7 9
loc
посвященный индексации тегов,iloc
Предназначенный для позиционного индексирования индексатор принимает однозначные, списочные, диапазонные, логические индексы и может индексировать как строки, так и столбцы.
(4) Булев индекс
df>5
Out[190]:
col1 col2 col3
row1 False False False
row2 False False True
row3 True True True
df[df>5]
Out[191]:
col1 col2 col3
row1 NaN NaN NaN
row2 NaN NaN 6.0
row3 7.0 8.0 9.0
df['col1']>2
Out[192]:
row1 False
row2 True
row3 True
Name: col1, dtype: bool
df.loc[df['col1']>2]
Out[193]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
df.loc[df['col1']>2,df.iloc[1]>5]
Out[196]:
col3
row2 6
row3 9
df.iloc[df['col1'].values>2]
Out[208]:
col1 col2 col3
row2 4 5 6
row3 7 8 9
Булев индекс — это особый вид индекса, который можно получить путем сравнения модели данных pandas или numpy, По сути, тип данныхbool
изSerie
илиDataFrame
илиndarray
, который имеет ту же форму, что и исходные данные, и определяет, соответствует ли каждый элемент критериям фильтра. Используйте логический индекс в индексаторе, чтобы отфильтровать подходящие данные.
2D логическое индексирование можно использовать для фильтрации при непосредственном индексировании.DataFrame
, форма останется неизменной, а элементы, не удовлетворяющие условиям, будут заменены наNaN
, который отличается от numpy.Когда numpy выполняет ту же форму фильтрации, он создаст подходящие элементы в виде нового одномерного массива и вернет его, одномерный логический индекс можно использовать только для фильтрации данных строки;
в настоящее время используюloc
При индексировании нельзя использовать двумерное логическое индексирование, для каждой оси можно использовать только одномерное логическое индексирование, которое должно быть указано параметромSeries
логический индекс с индексом метки, полученным операцией;
в настоящее время используюiloc
При индексировании нельзя использовать двумерное логическое индексирование, для каждой оси можно использовать только одномерное логическое индексирование, и оно должно быть одномерным логическим индексом.ndarray
Булев индекс без индекса метки, полученный операцией (Series.values
можно получить соответствующийndarray
).
(5) Поиск заданного значения
df=pd.DataFrame({'a':[np.nan,1,2],'b':[3,np.nan,4]})
df
Out[142]:
a b
0 NaN 3.0
1 1.0 NaN
2 2.0 4.0
df.isin([2,3])
Out[143]:
a b
0 False True
1 False False
2 True False
df.isna()
Out[144]:
a b
0 True False
1 False True
2 False False
isin
метод используется для поиска значения, присутствующего в указанном списке,isna
Метод используется для поиска значений NaN, оба метода возвращают логический индекс, обычно используемый в сочетании с индексатором.
2. Итерация строк и столбцов
pandas предоставляет итераторы для обхода строк или столбцов.
(1) Итерация строки
df=pd.DataFrame([{'a':1,'b':2,'c':3},{'a':4,'b':5,'c':6}])
for i,row in df.iterrows():
print("\nrow(%s):\n%s"%(i,row))
row(0):
a 1
b 2
c 3
Name: 0, dtype: int64
row(1):
a 4
b 5
c 6
Name: 1, dtype: int64
(2) Итерация столбца
for j,col in df.iteritems():
print("\ncol(%s):\n%s"%(j,col))
col(a):
0 1
1 4
Name: a, dtype: int64
col(b):
0 2
1 5
Name: b, dtype: int64
col(c):
0 3
1 6
Name: c, dtype: int64
3. Присоединение к таблице
pandas предоставляет sql-подобныйjoin
,merge
,concat
метод соединения таблиц.
(1) Индексное соединение
df1=pd.DataFrame([[1,2],[3,4]],columns=['col1','col2'],index=[1,0])
df2=pd.DataFrame([[5,6],[7,8]],columns=['col3','col4'],index=[0,1])
df1.join(df2,how='inner')
Out[229]:
col1 col2 col3 col4
1 1 2 7 8
0 3 4 5 6
join
Метод выполняет объединение таблиц на основе индексов,how
Параметр указывает способ подключения, естьinner
внутреннее соединение,outer
внешнее соединение,left
левое соединение,right
Право присоединиться к этим типам, по умолчаниюleft
.
здесьjoin
Это не то же самое, что присоединиться к SQL.
(2).Шпоночное соединение
df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
df1.merge(df2)
Out[235]:
col1 col2 col3
0 1 4 1
1 2 5 2
df1.merge(df2,how='left',left_on='col1',right_on='col3')
Out[237]:
col1 col2_x col2_y col3
0 1 4 4.0 1.0
1 2 5 5.0 2.0
2 2 5 7.0 2.0
3 3 6 NaN NaN
merge
Метод выполняет соединение таблиц на основе указанного ключа (столбца) черезon
параметр (тот же ключ) илиleft_on
иright_on
Указан параметр (разный ключ), а в качестве ключа подключения по умолчанию будет использоваться тот ключ, который есть в обеих таблицах;how
Параметр указывает способ подключения, естьinner
внутреннее соединение,outer
внешнее соединение,left
левое соединение,right
Право присоединиться к этим типам, по умолчаниюinner
.
Этот метод эквивалентен методу соединения в SQL.
(3).Сращивание
df1=pd.DataFrame({'col1':[1,2,3],'col2':[4,5,6]})
df2=pd.DataFrame({'col2':[4,5,7],'col3':[1,2,2]})
pd.concat([df1,df2])
Out[241]:
col1 col2 col3
0 1.0 4 NaN
1 2.0 5 NaN
2 3.0 6 NaN
0 NaN 4 1.0
1 NaN 5 2.0
2 NaN 7 2.0
pd.concat([df1,df2],join='inner')
Out[242]:
col2
0 4
1 5
2 6
0 4
1 5
2 7
pd.concat([df1,df2],axis=1)
Out[243]:
col1 col2 col2 col3
0 1 4 4 1
1 2 5 5 2
2 3 6 7 2
Используется для объединения таблиц, эквивалентно объединению всех в sql.
axis
Параметр указывает ось, используемую для сращивания, по умолчанию 0;join
Параметр указывает, как обрабатываются другие оси,inner
Указывает, что возвращаются только существующие элементы,outer
означает вернуть все, по умолчаниюouter
.
Результирующая таблица после объединения может иметь повторяющиеся индексы строк или индексы столбцов, и индексы могут быть реорганизованы по мере необходимости.
5. Добавления, исключения и изменения
1. Обновить
df=pd.DataFrame({'a':[1,2],'b':[3,4]})
df.iloc[0,0]=0
df[df>2]+=1
df
Out[262]:
a b
0 0 4
1 2 5
df['a']=[2,1]
df
Out[266]:
a b
0 2 4
1 1 5
df[:]=[1,2]
df
Out[269]:
a b
0 1 2
1 1 2
Способ обновления данных такой же, как у numpy.После индексации и фильтрации данных вы можете напрямую присваивать значения.Вы можете присвоить один и тот же скаляр всем элементам, или присвоить набор данных той же формы, или присвоить значения ко всем элементам.DataFrame
Каждой строке назначается одна и та же последовательность данных.
2. Увеличение
df=pd.DataFrame({'a':[1,2],'b':[3,4]})
df['c']=[5,6]
df
Out[248]:
a b c
0 1 3 5
1 2 4 6
df.loc[2]=-1
df
Out[253]:
a b c
0 1 3 5
1 2 4 6
2 -1 -1 -1
df.insert(0,'new',[0,0,0])
df
Out[255]:
new a b c
0 0 1 3 5
1 0 2 4 6
2 0 -1 -1 -1
С помощью индексатора вы можете напрямую присваивать значения новым строкам или новым столбцам.
insert
метод вставки нового столбца в указанную позицию,loc
Параметр указывает индекс позиции,column
Параметр указывает имя столбца,value
Задает данные для нового столбца.
3. Удалить
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
df[df['a']>2]
Out[277]:
a b
2 3 6
df.drop([0,2])
Out[281]:
a b
1 2 5
df.drop('a',axis=1)
Out[282]:
b
0 4
1 5
2 6
Самый гибкий способ удаления данных — отфильтровать ненужные данные с помощью индекса.
также доступны черезdrop
удалить данные указанной метки индекса,labels
Указывает теги для удаления, либо скаляр, либо список,axis
Параметр указывает ось для поиска меток индекса, по умолчанию 0. Этот метод удаляет на основе тега индекса, а не позиции, поэтому, если указанный тег дублируется, данные будут удалены вместе.
Если вы хотите сохранить удаленный столбец (например, вы хотите вставить столбец в другое место), вы можете использоватьpop
способ всплывающего столбца.
4. Изменить индекс
(1) Установите индекс
df=pd.DataFrame({'a':[1,2],'b':[3,4]})
df.set_index('a')
Out[46]:
b
a
1 3
2 4
df.set_index(keys=['a','b'],drop=False)
Out[47]:
a b
a b
1 3 1 3
2 4 2 4
set_index
метод для установки указанного столбца в качестве индекса:
первый параметрkeys
указать имя столбца;
второй параметрdrop
Укажите, следует ли удалять столбец, установленный в качестве индекса, по умолчаниюTrue
;
третий параметрappend
Установите, следует ли добавлять к существующему индексу, по умолчаниюFalse
;
четвертый параметрreplace
Укажите, следует ли изменять текущий объект, по умолчаниюFalse
.
(2) Сбросить индекс
В некоторых случаях, например, после серии ассоциаций таблиц и групповых вычислений,DataFrame
Индекс станет загроможденным, и вам нужен способ быстро сбросить индекс.
df=pd.DataFrame([['a','c',1],['a','d',2],['b','d',3],['b','d',4]],
columns=['col1','col2','col3'])
r=df.groupby(['col1','col2']).sum()
r
Out[34]:
col3
col1 col2
a c 1
d 2
b d 7
r.reset_index(drop=True)
Out[37]:
col3
0 1
1 2
2 7
r.reset_index(level=1)
Out[38]:
col2 col3
col1
a c 1
a d 2
b d 7
reset_index
метод для сброса индекса строки и вставки отброшенной информации индекса в виде столбцаDataFrame
:
первый параметрlevel
Вы можете указать уровень, который необходимо отбросить для многоуровневых индексов.По умолчанию отбрасываются все уровни, и индекс будет восстановлен доRangeIndex
;
второй параметрdrop
Вы можете указать, следует ли отбрасывать информацию индекса сброса.После того, как для этого элемента установлено значение True, информация индекса не будет вставлена.DataFrame
,дефолтFalse
;
третий параметрreplace
Укажите, следует ли изменять текущий объект, по умолчаниюFalse
.
(3) Рефакторинг индекса
df=pd.DataFrame({'a':[1,2],'b':[3,4]})
df.reindex(columns=['a','b','c','d'],fill_value=0)
Out[256]:
a b c d
0 1 3 0 0
1 2 4 0 0
reindex
Метод используется для реконструкции индекса, который может осуществлять сложные структурные изменения, включая добавление, удаление и сдвиг строк и столбцов:
второй параметрindex
установить новый индекс строки;
третий параметрcolumns
Установите новый индекс столбца, существующий индекс будет перемещен в новое место вместе с данными, а несуществующий индекс будет создан;
восьмой параметрfill_value
Вы можете указать значение заполнения вновь добавленной строки и столбца.
(4) Переименуйте индекс
df=pd.DataFrame([{'a':1,'b':2,'c':3},{'a':4,'b':5,'c':6}])
df
Out[52]:
a b c
0 1 2 3
1 4 5 6
df.rename({'a':'e','b':'f','c':'g'},axis=1)
Out[50]:
e f g
0 1 2 3
1 4 5 6
rename
метод для переименования существующих меток индекса:
первый параметрmapper
Используется для указания отношения сопоставления, которое может быть словарем или функцией, ввода исходного имени и вывода нового имени;
четвертый параметрaxis
Укажите переименованную ось, индекс строки соответствует 0, индекс столбца соответствует 1, а значение по умолчанию равно 0;
шестой параметрreplace
Укажите, следует ли изменять текущий объект, по умолчаниюFalse
.
5. Транспонирование строк и столбцов
df=pd.DataFrame({'a':[1,2],'b':[3,4]})
df
Out[134]:
a b
0 1 3
1 2 4
df.T
Out[135]:
0 1
a 1 2
b 3 4
DataFrame.T
Используется для реализации перестановки строк и столбцов, весь набор данных будет перевернут по диагонали сверху слева вниз справа.Series
Недопустимо вызывать метод транспонирования. Если вам нужно транспонировать, сначала вызовите его.to_frame
способDataFrame
.
6. Заполнение пропущенных значений
df=pd.DataFrame({'a':[np.nan,1,3],'b':[2,np.nan,6]})
df
Out[96]:
a b
0 NaN 2.0
1 1.0 NaN
2 3.0 6.0
df.fillna(0)
Out[97]:
a b
0 0.0 2.0
1 1.0 0.0
2 3.0 6.0
df.fillna(df.mean())
Out[98]:
a b
0 2.0 2.0
1 1.0 4.0
2 3.0 6.0
df.dropna()
Out[120]:
a b
2 3.0 6.0
df[df.isna()]=0
df
Out[122]:
a b
0 0.0 2.0
1 1.0 0.0
2 3.0 6.0
fillna
метод используется для заполнения пропущенных значений, первый параметрvalue
Установите значение для заполнения, вы можете передать скаляр, чтобы заполнить все столбцы одним и тем же значением, или вы можете передать словарь или серию, чтобы заполнить разные значения для разных столбцов; другое использование - указать второй параметрmethod
назначать,'ffill'
и'bfill'
Представляет заполнение предыдущим и следующим допустимыми значениями соответственно.
dropna
Методы используются для прямого удаления строк или столбцов с отсутствующими значениями:axis
Параметр указывает на удаление строки (0) или столбца (1);how
Параметр задает условия удаления,'all'
Указывает, что когда все значения NaN, удалить,'any'
Указывает, что один удаляется, если это NaN;thresh
Параметр настроен на выполнение удаления при появлении нескольких NaN.
isna
Метод работает с индексатором для обновления отсутствующих значений, назначая скаляры для заполнения всех столбцов одним и тем же значением или назначая последовательности для заполнения разных значений для разных столбцов.
6. Сортировка и дедупликация
1. Прямая и косвенная сортировка
df=pd.DataFrame([[2,'a'],[1,'c'],[3,'b']],columns=['col1','col2'],index=[3,2,1])
df
Out[6]:
col1 col2
3 2 a
2 1 c
1 3 b
df.sort_index()
Out[7]:
col1 col2
1 3 b
2 1 c
3 2 a
df.sort_values('col1')
Out[8]:
col1 col2
2 1 c
3 2 a
1 3 b
df.loc[df['col2'].sort_values().index]
Out[21]:
col1 col2
3 2 a
1 3 b
2 1 c
sort_index
методы можно сортировать по индексу,axis
Параметр указывает ось для сортировки, по умолчанию 0,level
Параметр задает уровень многоуровневого индекса, используемого для сортировки, по умолчанию — None,ascending
Параметр указывает, подниматься или нет, по умолчанию True.
sort_values
Методы можно сортировать по указанному ключу,by
параметр указывает ключ, используемый для сортировки,axis
Параметр указывает ось для сортировки, по умолчанию 0,ascending
Параметр указывает, подниматься или нет, по умолчанию True.
Косвенная сортировка может быть выполнена с помощьюloc
Метод реализован путем передачи отсортированного индекса метки, и индексы двух моделей данных перед сортировкой должны быть одинаковыми;iloc
Метод аналогичен, вам нужно передать numpyargsort
Индекс позиции после сортировки метода.
2. Дедупликация
df=pd.DataFrame({'a':[1,2,2,2],'b':[3,3,4,4]})
df
Out[10]:
a b
0 1 3
1 2 3
2 2 4
3 2 4
df.duplicated()
Out[11]:
0 False
1 False
2 False
3 True
dtype: bool
df.drop_duplicates()
Out[12]:
a b
0 1 3
1 2 3
2 2 4
df.drop_duplicates('a',keep='last')
Out[14]:
a b
0 1 3
3 2 4
duplicated
Метод используется для возврата одномерного логического массива, идентифицирующего результат дедупликации, зарезервированный элемент имеет значение True.subset
Параметр указывает метки строк или столбцов, участвующих в дедупликации, и по умолчанию используются все столбцы;keep
Параметр указывает метод хранения,'first'
означает сохранить первый элемент,'last'
означает сохранить последний элемент,None
Указывает на отсутствие бронирования.
drop_duplicates
Метод используется для возврата результата дедупликации.subset
иkeep
Роль параметров иduplicated
Такой же.
7. Выход из строя и выборка
1. Случайная сортировка
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
df.iloc[np.random.permutation(df.shape[0])]
Out[25]:
a b
1 2 5
0 1 4
2 3 6
df.sample(frac=1.)
Out[27]:
a b
0 1 4
2 3 6
1 2 5
Случайный порядок, используемый для перемешивания набора данных. Один из способов — генерировать индексы не по порядку с помощью numpy, а затем применять их в pandas.iloc
Индексный метод; другой метод заключается в использовании метода выборки панд.sample
, установите коэффициент дискретизацииfrac
Параметр равен 1. Тот же эффект может быть достигнут при использовании метода выборки по умолчанию без замены.
2. Отбор проб
df.sample(n=2)
Out[34]:
a b
1 2 5
2 3 6
df.sample(frac=0.8,replace=True)
Out[36]:
a b
1 2 5
1 2 5
sample
метод выборки, первый параметрn
Установите количество сэмплов, второй параметрfrac
Установить коэффициент дискретизации, третий параметрreplace
Установить, вернуть ли его обратно, по умолчаниюFalse
, четвертый параметрweight
Вес образца может быть установлен, пятый параметрrandom_state
Установите начальное число случайных чисел.
8. Чтение и письмо
1. Чтение и запись CSV
df=pd.DataFrame({'a':[1,2],'b':[3,4]},index=['r1','r2'])
df.to_csv()
Out[14]: ',a,b\nr1,1,3\nr2,2,4\n'
df.to_csv(index=False)
Out[15]: 'a,b\n1,3\n2,4\n'
df.to_csv("d:\\test.csv",index=False)
df2=pd.read_csv("d:\\test.csv")
df2
Out[18]:
a b
0 1 3
1 2 4
to_csv
Метод записи в файл csv:
параметрpath_or_buf
установить путь к файлу или объект, по умолчаниюNone
, что означает прямой возврат полной строки содержимого;
параметрsep
Установите разделитель, строку длиной 1, по умолчанию','
;
параметрna_rep
Установить заполнение отсутствующего значения, по умолчанию''
;
параметрfloat_format
Установите строку формата для чисел с плавающей запятой, например'%.2f'
Представляет два десятичных знака;
параметрcolumns
Установите столбец для записи, по умолчаниюNone
, означает все;
параметрheader
Установите, следует ли записывать имена столбцов, по умолчаниюTrue
, если задан список строк, в качестве псевдонимов столбцов;
параметрindex
Укажите, следует ли записывать метки индекса строки, по умолчаниюTrue
;
параметрindex_label
Установите имя столбца столбца индекса строки, по умолчаниюNone
, имя индекса будет использоваться напрямую, без записи имени столбца, его нужно установить наFalse
;
параметрencoding
Установите формат кодировки, по умолчанию python3utf-8
;
параметрchunksize
Установите размер блока для каждой пакетной записи, по умолчанию все данные записываются одновременно.
read_csv
Метод используется для чтения файла csv:
параметрfilepath_or_buffer
Установите путь к файлу или файлоподобный объект, ему должно быть присвоено значение;
параметрsep
Установите разделитель, строку длиной 1, по умолчанию','
;
параметрheader
Установите номер строки в качестве имени столбца, который можно передать в списке, который будет прочитан как многоуровневый индекс.По умолчанию в качестве имени столбца используется первая строка.names
Когда отображается имя столбца, этот параметр недействителен, кроме того, этот параметр будет пропускать строки комментариев и пустые строки;
параметрnames
установить список имен столбцов, по умолчаниюNone
, если файл не содержит имен столбцов,header
также должно быть установлено значениеNone
, этот параметр не может иметь дубликатов, будет сообщено об ошибке;
параметрindex_col
Установите номер столбца в качестве метки строки, которую можно передать в списке, который будет прочитан как многоуровневый индекс, и не задан по умолчанию;
параметрusecols
Установите список столбцов для чтения, который может быть списком позиций столбцов (int) или имен столбцов (str), или функцией, которая выполняет логическое суждение по именам столбцов.True
Столбцы будут возвращены;
параметрprefix
Установите префикс имени столбца по умолчанию.Если имя столбца не задано, в качестве имени столбца будет использоваться префикс в сочетании с номером столбца;
параметрdtype
установить тип данных,dict
Тип, ключ — имя столбца, значение — тип данных numpy, значение по умолчаниюNone
;
параметрskiprows
Установите количество пропускаемых строк в начале, которые необходимо передать вint
, вы также можете установить номер строки для пропуска, переходаlist of int
Или функция, которая выполняет логическое суждение о номерах строк;
параметрskipfooter
Установите количество строк для пропуска в конце, которые необходимо передать вint
;
параметрnrows
Установите количество строк для чтения, для пакетного чтения больших файлов;
параметрna_filter
Установите, следует ли обнаруживать пропущенные значения, по умолчаниюTrue
, который можно отключить, чтобы повысить производительность чтения, когда будет установлено, что пропущенных значений нет;
параметрskip_blank_lines
Установите, пропускать ли пустые строки, по умолчаниюTrue
;
параметрencoding
Установите формат кодировки, по умолчанию python3utf-8
;
параметрerror_bad_lines
Установите, следует ли сообщать об ошибке для плохой строки с ненормальным количеством столбцов, по умолчаниюTrue
,False
Когда плохая линия сразу устраняется;
параметрchunksize
Установите размер чанка, если он установлен, он будет считываться кусками этого размера и возвращаться как итератор.
2. Читать и писать в Excel
df=pd.DataFrame({'a':[1,2],'b':[3,4]},index=['r1','r2'])
df.to_excel('d:\\test.xlsx',sheet_name='test1',index=False)
df2=pd.read_excel('d:\\test.xlsx',sheet_name=0)
df2
Out[9]:
a b
0 1 3
1 2 4
to_excel
Способ записи в файлы xls или xlsx:
параметрexcel_writer
Установите путь к файлу или ExcelWriter, должно быть присвоено значение;
параметрsheet_name
Установите имя рабочего листа для чтения, по умолчанию'Sheet1'
;
параметрna_rep
Установить заполнение отсутствующего значения, по умолчанию''
;
параметрfloat_format
Установите строку формата для чисел с плавающей запятой, например'%.2f'
Представляет два десятичных знака;
параметрcolumns
Установите столбец для записи в виде последовательности имен столбцов;
параметрheader
Установите, следует ли записывать имена столбцов, по умолчаниюTrue
, который используется как псевдоним столбца при вводе списка строк;
параметрindex
Укажите, следует ли записывать метки индекса строки, по умолчаниюTrue
;
параметрindex_label
Задайте имя столбца столбца индекса строки. При наличии многоуровневого индекса необходимо ввести список строк. Значение по умолчаниюNone
, имя индекса будет использоваться напрямую;
параметрstartrow
Установите начальную строку для письма, по умолчанию0
;
параметрstartcol
Установите начальный столбец для записи, по умолчанию0
;
параметрmerge_cells
Установите, объединяются ли ячейки, по умолчаниюTrue
.
read_excel
метод чтения файлов xls или xlsx:
параметрio
Установите путь к файлу или объект файла Excel, должно быть присвоено значение;
параметрsheet_name
Установите рабочий лист для чтения, вы можете передать серийный номер (int) или имя рабочего листа (str) или список, содержащий первые два, передатьNone
означает все, по умолчанию0
;
параметрheader
Установите номер строки, который анализируется как имя столбца. Когда список номеров строк передается, он будет анализироваться как многоуровневый индекс. Если имя столбца отсутствует, его необходимо установить наNone
;
параметрnames
установить имена столбцов с помощьюheader
используется вместе, по умолчаниюNone
;
параметрindex_col
Установите номер столбца, анализируемый как метка строки. Когда список номеров столбцов передается, он будет анализироваться как многоуровневый индекс. По умолчаниюNone
;
параметрusecols
Установите возвращаемые столбцы, список номеров столбцов можно передать вlist of int
, список имен столбцовlist of str
, последовательность имен столбцов, разделенных запятыми (например, «A,B,C»), или диапазон имен столбцов, обозначенных двоеточием (например, «A:E»).str
, вы также можете передать функцию, которая выполняет логическое определение имени столбца, и результатом будетTrue
Столбцы будут возвращены;
параметрdtype
установить тип данных,dict
Тип, ключ — имя столбца, значение — тип данных numpy, значение по умолчаниюNone
;
параметрskiprows
Установите количество пропускаемых строк в начале, которые необходимо передать вint
, вы также можете установить номер строки для пропуска, переходаlist of int
Или функция, которая выполняет логическое суждение о номерах строк;
параметрskipfooter
Установите количество строк для пропуска в конце, которые необходимо передать вint
.
Если имя листа непонятно и необходимо получить все имена листов, можно использовать следующие методы.
excel=pd.ExcelFile(file_path)
excel.sheetname
3. Читать и писать sql
import sqlalchemy as sqla
username='sa'
password='123456'
server='127.0.0.1'
database='Test'
charset='utf8'
engine = sqla.create_engine('mssql+pymssql://{}:{}@{}/{}?charset={}'.format(username,password,server,database,charset))
df=pd.DataFrame({'a':[1,2],'b':[3,4]},index=['r1','r2'])
df.to_sql('test1',engine,if_exists='append',index=False)
df.to_sql('test1',engine,if_exists='append',index=False)
df2=pd.read_sql('select * from test1',engine)
df2
Out[28]:
a b
0 1.0 3.0
1 2.0 4.0
2 1.0 3.0
3 2.0 4.0
to_sql
метод записи в базу данных:
параметрname
Установите имя таблицы для записи,str
тип;
параметрconn
настроить подключение к базе данных,sqlalchemy.engine.Engine
тип, который необходимо использовать с библиотекой sqlalchemy, черезcreate_engine
создание метода, формат строки подключения выглядит следующим образом'{数据库类型}+{驱动名}://{用户名}:{密码}@{服务器地址}:{端口号}/{数据库名}?charset={字符集}'
;
параметрif_exists
Установите, как обрабатывается таблица, когда она существует,'fail'
Указывает, что выброшено исключение,'replace'
означает замену существующей таблицы,'append'
Указывает на вставку в существующую таблицу в качестве новых данных, по умолчанию'fail'
;
параметрindex
Установите, будут ли метки индексов строк записываться как столбцы, по умолчаниюTrue
;
параметрindex_label
Задайте имя столбца столбца метки индекса строки. При наличии многоуровневого индекса необходимо ввести список строк. Значение по умолчаниюNone
, имя индекса будет использоваться напрямую;
параметрchunksize
Установите размер блока для каждой пакетной записи и по умолчанию записывайте все данные за один раз;
параметрdtype
Установите тип данных для записи,dict
Тип, ключ — это имя столбца, а значение — тип данных sqlalchemy.
read_sql
Метод используется для чтения базы данных:
параметрsql
Установите SQL-запрос или имя таблицы для выполнения;
параметрconn
настроить подключение к базе данных,sqlalchemy.engine.Engine
тип;
параметрindex_col
Установите имя столбца в качестве индекса метки строки, многоуровневый индекс будет создан при передаче списка имен столбцов;
параметрcoerce_float
Укажите, следует ли пытаться преобразовать значение некоторых нестрочных нечисловых объектов (таких как decimal.Decimal) в числа с плавающей запятой, по умолчаниюTrue
;
параметрparams
Установите список параметров, передаваемых для выполнения sql, конкретный формат определяется используемым драйвером;
параметрparse_dates
Установите список имен столбцов для разрешения во время, по умолчаниюNone
;
параметрcolumns
Установите столбец для чтения, только еслиsql
Параметр действителен, когда передается имя таблицы, значение по умолчаниюNone
читать все столбцы;
параметрchunksize
Установите размер чанка, если он установлен, он будет считываться кусками этого размера и возвращаться как итератор.
9. Быстрое рисование
Когда объект данных pandas готов, вы можете вызвать метод для рисования напрямую.Быстрое рисование, предоставляемое pandas, подходит только для одиночного рисования, что неудобно для построения сложных диаграмм.При необходимости используйте метод matplotlib для создания изображений. и подграфы.
1. График
df=pd.DataFrame({'a':[1,1.5,2.5,4],'b':[3,2.1,3.2,1],'c':[1,2,3,4]})
fig=plt.figure(figsize=(12,4))
ax1=fig.add_subplot(1,2,1)
df.plot.line(ax=ax1)
ax2=fig.add_subplot(1,2,2)
df.plot.line(x='c',y=['a','b'],ax=ax2)
#plt.show()
Out[53]: <matplotlib.axes._subplots.AxesSubplot at 0x2aefe00ddd8>
параметрx
Задайте имя столбца как данные по оси x (только один), параметрy
Задайте имя столбца/список имен столбцов как данные по оси Y, параметрax
Установите объект подграфа, по умолчаниюNone
Рисуй в одиночестве.
plt.figure
для создания образов,figsize
Используется для установки размера изображения, типа кортежа, формата(weight,height)
;
Figure.add_subplot
Используется для создания подграфов, первый параметр задает количество вертикальных разделов, второй параметр задает количество горизонтальных разделов, а третий параметр задает количество подграфов, которые располагаются по горизонтали, а затем по вертикали в соответствии с разделом;plt.plot
Он используется для отображения нарисованного изображения, которое можно опустить в текущей сцене.После того, как ipython вызовет метод рисования pandas, оно будет отображаться напрямую.
Чтобы нарисовать график, вы также можете использоватьplot(kind='line')
,параметрkind
также можно опустить, так как значение по умолчанию равно'line'
.
2. Гистограмма
df=pd.DataFrame({'a':[1,1.5,2.5,4],'b':[3,2.1,3.2,1],'c':[1,2,3,4]})
fig=plt.figure(figsize=(12,4))
ax1=fig.add_subplot(1,2,1)
df.plot.bar(ax=ax1)
ax2=fig.add_subplot(1,2,2)
df.plot.bar(stacked=True,ax=ax2)
Out[147]: <matplotlib.axes._subplots.AxesSubplot at 0x2aeff4f17b8>
параметрstacked
Устанавливает, будет ли гистограмма складываться.
Вместо этого необходимо использовать горизонтальные гистограммы.DataFrame.plot.barh
метод.
3. Гистограмма
df=pd.DataFrame({'a':[1,2,2,3],'b':[3,3,3,4],'c':[1,2,3,4]})
fig=plt.figure(figsize=(12,4))
ax1=fig.add_subplot(1,2,1)
df.plot.hist(alpha=0.5,ax=ax1)
ax2=fig.add_subplot(1,2,2)
df.plot.hist(stacked=True,bins=4,ax=ax2)
Out[210]: <matplotlib.axes._subplots.AxesSubplot at 0x2aefff32080>
параметрalpha
установить прозрачность, параметрstacked
Установить, следует ли складывать, параметрbins
Установите количество лотков.
Сотрудничатьdiff
Вы можете нарисовать гистограмму, разделенную на подграфики по столбцу:
df.diff().hist(bins=4)
Out[165]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000002AE805A4748>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000002AE805E3D68>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x000002AE80615390>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000002AE8063DA20>]],
dtype=object)
4. Блочная диаграмма
df = pd.DataFrame(np.random.rand(10, 4),columns=['A','B','C','D'])
df.plot.box()
Out[167]: <matplotlib.axes._subplots.AxesSubplot at 0x2aeff644080>
5. Точечная диаграмма
df=pd.DataFrame(np.random.rand(50,3),columns=['a','b','c'])
fig=plt.figure(figsize=(12,4))
ax1=fig.add_subplot(1,2,1)
df.plot.scatter(x='a',y='b',s=df['c']*200,ax=ax1)
ax2=fig.add_subplot(1,2,2)
df[df['c']>=0.5].plot.scatter(x='a',y='b',color='b',label='c1',ax=ax2)
df[df['c']<0.5].plot.scatter(x='a',y='b',color='g',label='c2',ax=ax2)
Out[186]: <matplotlib.axes._subplots.AxesSubplot at 0x2ae81a82e48>
параметрx
Задайте имя столбца как данные по оси x (только один), параметрy
Задайте имя столбца как данные оси Y (только один), параметрs
заданный размер точки, параметрcolor
цвет уставки, параметрlabel
Чтобы установить метки, когда вам нужно нарисовать точки разными цветами для каждой категории, отфильтруйте данные каждой категории и нарисуйте их на одном и том же подграфе, а также укажите цвет и метку.
6. Круговая диаграмма
df=pd.DataFrame(2*np.random.rand(3,2),index=['a','b','c'],columns=['p1','p2'])
df.plot.pie(y='p1',figsize=(4,4))
Out[204]: <matplotlib.axes._subplots.AxesSubplot at 0x2ae81f66cf8>
df.plot.pie(subplots=True,figsize=(8.5,4))
Out[206]:
array([<matplotlib.axes._subplots.AxesSubplot object at 0x000002AE8171BEB8>,
<matplotlib.axes._subplots.AxesSubplot object at 0x000002AEFFFD78D0>],
dtype=object)
Есть два метода рисования, один параметрy
Укажите столбец в качестве значения для построения круговой диаграммы, а второй - для задания параметровsubplots
заTrue
, который рисует подграфики с данными для каждого столбца.figsize
общий параметр для рисования, используемый для установки размера изображения.
10. Обработка специальных типов
1. Обработка строк
(1) Оператор
df=pd.DataFrame([['a','head',1],['b','Body',2],['c','FOOT',3]],
columns=['col1','col2','col3'])
df['col1']+df['col2']
Out[54]:
0 ahead
1 bBody
2 cFOOT
dtype: object
df['col1']*df['col3']
Out[55]:
0 a
1 bb
2 ccc
dtype: object
Строковые типы поддерживают две операторные операции: конкатенацию (str + str) и повторение (str * int).
(2) Строковый метод
Series.str
Метод обработки строк инкапсулирован ниже, и большинство методов класса str в python наследуются.
Вот некоторые часто используемые методы:
индексатор
df['col2'].str[:2]
Out[60]:
0 he
1 Bo
2 FO
Name: col2, dtype: object
длина строки
df['col2'].str.len()
Out[73]:
0 4
1 4
2 4
Name: col2, dtype: int64
преобразование регистра
#转大写
#isupper方法判断是否大写
df['col2'].str.upper()
Out[56]:
0 HEAD
1 BODY
2 FOOT
Name: col2, dtype: object
#转小写
#islower方法判断是否大写
df['col2'].str.lower()
Out[57]:
0 head
1 body
2 foot
Name: col2, dtype: object
#首字母大写
df['col2'].str.capitalize()
Out[58]:
0 Head
1 Body
2 Foot
Name: col2, dtype: object
#大小写互转
df['col2'].str.swapcase()
Out[59]:
0 HEAD
1 bODY
2 foot
Name: col2, dtype: object
заполнение
#填充至width长度
#side可设置'left'/'right'/'both'
df['col2'].str.pad(width=10, side='right', fillchar='-')
Out[63]:
0 head------
1 Body------
2 FOOT------
Name: col2, dtype: object
#居中填充
#等效于pad(side='both')
df['col2'].str.center(width=11, fillchar='*')
Out[66]:
0 ****head***
1 ****Body***
2 ****FOOT***
Name: col2, dtype: object
соединение
#将一列字符串拼接成一个字符串
#sep设置分隔符
df['col2'].str.cat(sep=',')
Out[67]: 'head,Body,FOOT'
#将两列字符串拼接成一列字符串
#na_rep设置空值填充
df['col2'].str.cat(['d','e',np.nan],sep=',',na_rep='?')
Out[68]:
0 head,d
1 Body,e
2 FOOT,?
Name: col2, dtype: object
#将两列字符串拼接成一列字符串
#join设置连接方式
ss=pd.Series(['d','e','f'],index=[0,3,5])
df['col2'].str.cat(ss,sep=',',na_rep='?',join='left')
Out[69]:
0 head,d
1 Body,?
2 FOOT,?
Name: col2, dtype: object
#将每个元素上的字符串列表拼接
ss=pd.Series([['a','b'],['c','d']])
ss.str.join(',')
Out[72]:
0 a,b
1 c,d
dtype: object
расколоть
#拆分字符串并以列表作为元素返回
#pat分隔符默认为' ',可设置正则表达式用于分割
ss=pd.Series(['a,b,c','d,e'])
ss.str.split(pat=',')
Out[74]:
0 [a, b, c]
1 [d, e]
dtype: object
#n限制分割的次数,expand设置是否将拆分后的字符串展开至列
ss.str.split(pat=',',n=1,expand=True)
Out[76]:
0 1
0 a b,c
1 d e
найти и заменить
#是否包含
#pat可设置一般字符串或正则表达式
df['col2'].str.contains('a')
Out[89]:
0 True
1 False
2 False
Name: col2, dtype: bool
#正则匹配
#pat只能设置正则表达式
#另有startswith,endswith方法可用于匹配开头和结尾
#另有extract,extractall方法可用于抽取匹配的组
df['col2'].str.match('[a-z]*')
Out[90]:
0 True
1 True
2 True
Name: col2, dtype: bool
#查找匹配并返回索引
#另有findall方法可查找全部匹配并以列表元素返回
#另有index方法可通过start,end设置查找范围
df['col2'].str.find('d')
Out[91]:
0 3
1 2
2 -1
Name: col2, dtype: int64
#统计指定模式出现次数
df['col2'].str.count('O')
Out[92]:
0 0
1 0
2 2
Name: col2, dtype: int64
#替换
#第一个参数pat设置匹配模式,第二个参数repl设置用于替换的字符串
#参数n设置替换次数
#另有translate方法用于批量映射字符
df['col2'].str.replace('d','e')
Out[93]:
0 heae
1 Boey
2 FOOT
Name: col2, dtype: object
удалить начальные и конечные символы
#另有lstrip,rstrip方法分别用于删除首和尾的字符
df['col2'].str.strip('d')
Out[96]:
0 hea
1 Body
2 FOOT
Name: col2, dtype: object
#可设置正则表达式
df['col2'].str.strip('[FT]')
Out[98]:
0 head
1 Body
2 OO
Name: col2, dtype: object
2. Обработка времени
(1) Тип времени
pd.Timestamp('2017-01-01 20:30:00',freq='D')
Out[80]: Timestamp('2017-01-01 20:30:00', freq='D')
pd.Period('2017-01-01 20:30')
Out[81]: Period('2017-01-01 20:30', 'T')
pd.Timedelta('2 days 1 hours')
Out[82]: Timedelta('2 days 01:00:00')
pd.Timedelta(1,unit='Y')
Out[83]: Timedelta('365 days 05:49:12')
from datetime import datetime
pd.Timestamp(datetime.now())
Out[84]: Timestamp('2019-05-18 16:14:26.691659')
pandas имеет два типа времени:Timestamp
иPeriod
,Timestamp
изdtype
заdatetime64
,Period
изdtype
заobject
.Timestamp
Нельзя указать периодичность времени при созданииfreq
параметры, но приведет к невозможности участия в операции;Period
будет автоматически установлен в соответствии с введенным значениемfreq
. Преобразует тип времени библиотеки datetime.
Timedelta
тип временной дельты, первый параметрvalue
Укажите сумму сдачи, тип вводаint
должен соответствовать второму параметруunit
(единица) использования и тип времени вfreq
это значение, по умолчанию'ns'
; Также можно ввести строковый тип, соответствующий всем расширенным именованным параметрам (дни, секунды, микросекунды, миллисекунды, минуты, часы, недели), которые могут быть заданы параметрами, либо объявлены в виде строки.
поддерживаетсяfreq
Значения (в порядке убывания): 'Y', 'M', 'W', 'D', 'дни', 'день', 'часы', час', 'час', 'ч' , 'м', 'минута', 'мин', 'минуты', 'Т', 'С', 'секунды', 'сек', 'секунда', 'мс', 'миллисекунды', 'миллисекунды', 'милли ', 'миллис', 'L', 'нас', 'микросекунды', 'микросекунда', 'микро', 'микрос', 'U', 'нс', 'наносекунды', 'нано', 'нано', «наносекунда», «N».
(2). Сроки
генерировать
#时间范围
tr=pd.date_range(start='2017-01-01',periods=5,freq='2H')
tr
Out[7]:
DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 02:00:00',
'2017-01-01 04:00:00', '2017-01-01 06:00:00',
'2017-01-01 08:00:00'],
dtype='datetime64[ns]', freq='2H')
#另一种时间范围
pr=pd.period_range(start='2017-01-01',periods=5,freq='D')
pr
Out[9]:
PeriodIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
'2017-01-05'],
dtype='period[D]', freq='D')
#时间差范围
tdr=pd.timedelta_range(start='1 day', end='2 days', freq='6H')
tdr
Out[11]:
TimedeltaIndex(['1 days 00:00:00', '1 days 06:00:00', '1 days 12:00:00',
'1 days 18:00:00', '2 days 00:00:00'],
dtype='timedelta64[ns]', freq='6H')
#时间间隔范围
ir=pd.interval_range(start=pd.Timestamp('2017-01-01'),periods=3, freq='MS')
ir
Out[31]:
IntervalIndex([(2017-01-01, 2017-02-01], (2017-02-01, 2017-03-01], (2017-03-01, 2017-04-01]]
closed='right',
dtype='interval[datetime64[ns]]')
pd.date_range
иpd.period_range
для генерации диапазона времени,pd.timedelta_range
для генерации изменяющихся во времени диапазонов,pd.interval_range
Для генерации диапазонов временных интервалов.
Вышеупомянутый метод имеет несколько параметров с одной и той же функцией:
start
начало диапазона, заданного параметром;end
конец диапазона, заданного параметром;
periods
Параметр указывает количество циклов (т. е. количество) для генерации;freq
Параметр задает частоту (т.е. интервал) генерации;
name
Параметр указывает сгенерированное имя индекса;closed
Параметр указывает метод закрытия интервала.Поддерживаемые значения:'left'
,'right'
,None
(то есть обе стороны закрыты), по умолчаниюNone
.
start
,end
,periods
,freq
Укажите не менее трех из этих четырех параметров.
Эти методы генерируют типы индексов, к которым можно получить доступ.to_series()
или.to_frame()
преобразовать вSeris
илиDataFrame
.
изменять
tr=pd.date_range(start='2017-01-01',periods=5,freq='2H')
#移动范围
tr.shift(-1,freq='D')
Out[172]:
DatetimeIndex(['2016-12-31 00:00:00', '2016-12-31 02:00:00',
'2016-12-31 04:00:00', '2016-12-31 06:00:00',
'2016-12-31 08:00:00'],
dtype='datetime64[ns]', freq='2H')
ts=pd.Series(np.arange(len(tr)),index=tr)
#按指定频率重采样
ts.asfreq(freq='4H')
Out[175]:
2017-01-01 00:00:00 0
2017-01-01 04:00:00 2
2017-01-01 08:00:00 4
Freq: 4H, dtype: int32
shift
Метод используется для перемещения временного диапазона, первый параметрn
Укажите количество движения, второй параметрfreq
Укажите частоту.
asfreq
Метод используется для повторной выборки на указанной частоте и может использоваться только для индексированных по времениSeries
илиDataFrame
, первый параметрfreq
укажите частоту, второй параметрmethod
указать заполнениеNaN
метод, когда новая частота дискретизации не делится на старую частоту, значениеNaN
недопустимые образцы , необязательно'ffill'
(предыдущее допустимое значение) и'bfill'
(последнее допустимое значение), по умолчаниюNone
(без прокладки).
(3) Получить временную часть
тип времени
t=pd.Timestamp('2017-01-02 20:30:40.50')
t.date()
Out[101]: datetime.date(2017, 1, 2)
t.year
Out[102]: 2017
t.month
Out[103]: 1
t.day
Out[104]: 2
t.time()
Out[105]: datetime.time(20, 30, 40, 500000)
t.hour
Out[106]: 20
t.minute
Out[107]: 30
t.second
Out[108]: 40
t.microsecond
Out[109]: 500000
t.quarter
Out[110]: 1
t.weekday()
Out[118]: 0
t.day_name()
Out[119]: 'Monday'
t.week
Out[120]: 1
тип времениSeries
вызываемый.dt
собственность с тем же именем под,date
,time
,weekday
методы становятся доступными как свойства,day_name
метод черезweekday_name
доступ к собственности.
Тип временной дельты
td=pd.Timedelta(weeks=0,days=1,hours=2,minutes=3,seconds=4,
milliseconds=5,microseconds=6)
td.days
Out[141]: 1
td.seconds
Out[142]: 7384
td.microseconds
Out[143]: 5006
td.total_seconds()
Out[145]: 93784.005006
Timedelta
изtotal_seconds
метод получения общего количества секунд;days
,seconds
,microseconds
Получить каждую часть, разделить только эти три,years
,months
,hours
,minutes
и т.д. нет.
изменяющийся во времени типSeries
вызываемый.dt
свойство или метод с тем же именем в .
(4) Преобразование типов
Другие виды времени передачи
from datetime import datetime
t=pd.Timestamp(datetime.now())
p=pd.Period(t,freq='D')
При создании одного типа времени вы можете напрямую передать тип, поддерживающий преобразование, для завершения преобразования.Period
должен быть указанfreq
.
ss=pd.Series(['2017-01-01','2017-01-02'])
ss.astype('datetime64')
Out[183]:
0 2017-01-01
1 2017-01-02
dtype: datetime64[ns]
pd.to_datetime(ss)
Out[184]:
0 2017-01-01
1 2017-01-02
dtype: datetime64[ns]
Series
иDataFrame
изastype
метод, указывающий типdatetime64
конвертируемый тип во время, статическийpd.to_datetime
Можно сделать эквивалентное преобразование.
Series
иDataFrame
изto_period
иto_timestamp
Метод действует на индекс вместо данных и вызывает одноименный метод индекса, гдеDatetimeIndex
иPeriodIndex
Можно преобразовать между этими двумя методами.
пора натягивать
tr=pd.date_range(start='2017-01-01',periods=5,freq='D')
tr.strftime('%Y-%m-%d,%a')
Out[231]:
Index(['2017-01-01,Sun', '2017-01-02,Mon', '2017-01-03,Tue', '2017-01-04,Wed',
'2017-01-05,Thu'],
dtype='object')
Series
Тип доступен через.dt
Одноименный метод ниже вызывает метод преобразования.
Поддерживаемые форматы преобразования определяются следующим образом:
%y
Год (две цифры)
%Y
Год (четыре цифры)
%m
Луна
%d
день
%H
Час (24-часовой формат)
%I
Час (12-часовые часы)
%M
Минута
%S
второй
%j
день года
%p
AM или PM, AM или PM
%U
Неделя в году, воскресенье - начало недели
%w
Неделя, воскресенье начало недели
%W
Неделя в году, понедельник - начало недели
%
%Y-%m-%d %H:%M:%S
короткая форма
%F
%Y-%m-%d
короткая форма
%D
%m/%d/%y
короткая форма
%a
аббревиатура местной недели
%A
местное название недели
%b
аббревиатура местного месяца
%B
местное название месяца
%c
Локальное представление даты и представление времени
%x
локальное представление даты
%X
представление местного времени
%Z
Название текущего часового пояса
%%
Сам знак %
(5).Время работы
#标量值时间
pd.Period('2017-01-01 20:30:00',freq='D')+1
Out[253]: Period('2017-01-02', 'D')
ss1=pd.Series(['2017-01-01','2017-02-02'])
ss1=ss1.astype('datetime64')
ss2=pd.Series(['2017-01-05','2017-02-04'])
ss2=ss2.astype('datetime64')
#时间-时间
ss2-ss1
Out[255]:
0 4 days
1 2 days
dtype: timedelta64[ns]
#获取时间变化量的属性
(ss2-ss1).dt.days
Out[256]:
0 4
1 2
dtype: int64
#时间变化量缩放
(ss2-ss1)*2
Out[257]:
0 8 days
1 4 days
dtype: timedelta64[ns]
#时间+时间变化量
ss1+pd.Timedelta(days=1)
Out[258]:
0 2017-01-02
1 2017-02-03
dtype: datetime64[ns]
Поддерживаются следующие операции:
время - время = дельта времени
дельта времени + дельта времени = дельта времени
дельта времени * целое число = дельта времени
время + дельта времени = время
(время:period
илиdatetime
, изменение времени:timedelta
, целое число:int
)
скалярное значениеTimestamp
иPeriod
в обстановкеfreq
В случае прямого сложения или вычитания целых чисел.