[python][научные вычисления][pandas] руководство пользователя

Python

Дата последнего обновления: 2019/9/23

Краткое введение в новую строку и обработку времени
Заполнение отсутствующих значений, удаление, чтение и запись раздела excel сделано небольшое дополнение
Глава 4 добавляет методы для использования итераторов строк-столбцов.
Глава 5 добавляет методы установки, сброса и переименования индексов.
Третья глава дополняет справочный список основных операторов и соответствующих функций, вычислений сдвига и разности.

pandasоснован наnumpyБиблиотека анализа данных предоставляет несколько более простых в использовании моделей данных и большое количество эффективных статистических методов.

Импортируйте модуль перед его использованием:

import pandas as pd

При необходимости импортируйте следующие модули:

import numpy as np

import matplotlib.pyplot as plt

Нажмите на ссылки ниже, чтобы перейти к каждому разделу

Руководство пользователя 1. Модель данных и свойства (индекс, ряд данных, фрейм данных, категориальные данные)

Руководство пользователя 2 — Типы данных и преобразования (Типы данных, преобразования типов)

Руководство пользователя 3. Массивы и статистические операции (базовые операции и скалярные функции, статистические методы, пользовательские функции, трансляция)

Руководство пользователя 4. Запросы и ассоциации (поиск по индексу, итерация строк и столбцов, объединение таблиц)

Руководство пользователя 5 - Добавление, удаление и модификация (обновление, добавление, удаление, изменение индекса, перестановка строк и столбцов, заполнение пропущенных значений)

Руководство пользователя 6. Сортировка и дедупликация (прямая и косвенная сортировка, дедупликация)

Руководство пользователя 7. Перемешивание и выборка (случайная сортировка, выборка)

Руководство пользователя 8 - Чтение и запись (чтение и запись csv, чтение и запись excel, чтение и запись sql)

Руководство пользователя 9. Быстрое построение графиков (линия, гистограмма, гистограмма, квадрат, точечная, круговая диаграмма)

Руководство пользователя 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день года
%pAM или 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В случае прямого сложения или вычитания целых чисел.