Сравнение с электронными таблицами#

Поскольку многие потенциальные пользователи pandas знакомы с программами для работы с электронными таблицами, такими как Excel, эта страница предназначена для предоставления некоторых примеров того, как различные операции с электронными таблицами выполняются с использованием pandas. Эта страница будет использовать терминологию и ссылки на документацию для Excel, но многое будет одинаковым/похожим в Google Sheets, LibreOffice Calc, Apple Numbers, и другое совместимое с Excel программное обеспечение для работы с электронными таблицами.

Если вы новичок в pandas, возможно, вам сначала стоит прочитать 10 минут до pandas чтобы ознакомиться с библиотекой.

Как принято, мы импортируем pandas и NumPy следующим образом:

In [1]: import pandas as pd

In [2]: import numpy as np

Структуры данных#

Общий перевод терминологии#

pandas

Excel

DataFrame

worksheet

Series

столбец

Index

заголовки строк

строка

строка

NaN

пустая ячейка

DataFrame#

A DataFrame в pandas аналогичен листу Excel. В то время как книга Excel может содержать несколько листов, pandas DataFrames существуют независимо.

Series#

A Series это структура данных, представляющая один столбец DataFrame. Работа с Series аналогично ссылке на столбец электронной таблицы.

Index#

Каждый DataFrame и Series имеет Index, которые являются метками на строки данных. В pandas, если индекс не указан, RangeIndex используется по умолчанию (первая строка = 0, вторая строка = 1 и так далее), аналогично заголовкам/номерам строк в электронных таблицах.

В pandas индексы могут быть установлены на одно (или несколько) уникальных значений, что аналогично наличию столбца, используемого в качестве идентификатора строки в таблице. В отличие от большинства электронных таблиц, эти Index значения могут фактически использоваться для ссылки на строки. (Обратите внимание, что это можно сделать в Excel с использованием структурированных ссылок.) Например, в электронных таблицах вы бы ссылались на первую строку как A1:Z1, тогда как в pandas вы могли бы использовать populations.loc['Chicago'].

Значения индекса также сохраняются, поэтому если вы переупорядочиваете строки в DataFrame, метка для конкретной строки не изменяется.

См. документация по индексированию для получения дополнительной информации о том, как использовать Index эффективно.

Копии vs. операции на месте#

Большинство операций pandas возвращают копии Series/DataFrame. Чтобы изменения "сохранились", вам нужно либо присвоить новой переменной:

sorted_df = df.sort_values("col1")

или перезаписать исходный:

df = df.sort_values("col1")

Примечание

Вы увидите inplace=True или copy=False аргумент ключевого слова доступен для некоторых методов:

df.replace(5, inplace=True)

Идет активное обсуждение об устаревании и удалении inplace и copy для большинства методов (например, dropna) за исключением очень небольшого подмножества методов (включая replace). Оба ключевых слова больше не будут необходимы в контексте Copy-on-Write. Предложение можно найти здесь.

Ввод / вывод данных#

Создание DataFrame из значений#

В электронной таблице, Значения можно вводить непосредственно в ячейки.

Pandas DataFrame может быть построен множеством различных способов, но для небольшого количества значений часто удобно задавать его как словарь Python, где ключи - это имена столбцов, а значения - данные.

In [3]: df = pd.DataFrame({"x": [1, 3, 5], "y": [2, 4, 6]})

In [4]: df
Out[4]: 
   x  y
0  1  2
1  3  4
2  5  6

Чтение внешних данных#

Оба Excel и pandas может импортировать данные из различных источников в различных форматах.

CSV#

Давайте загрузим и отобразим tips набор данных из тестов pandas, который представляет собой CSV-файл. В Excel вы бы загрузили и затем открыть CSV. В pandas вы передаете URL или локальный путь CSV-файла в read_csv():

In [5]: url = (
   ...:     "https://raw.githubusercontent.com/pandas-dev"
   ...:     "/pandas/main/pandas/tests/io/data/csv/tips.csv"
   ...: )
   ...: 

In [6]: tips = pd.read_csv(url)

In [7]: tips
Out[7]: 
     total_bill   tip     sex smoker   day    time  size
0         16.99  1.01  Female     No   Sun  Dinner     2
1         10.34  1.66    Male     No   Sun  Dinner     3
2         21.01  3.50    Male     No   Sun  Dinner     3
3         23.68  3.31    Male     No   Sun  Dinner     2
4         24.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       29.03  5.92    Male     No   Sat  Dinner     3
240       27.18  2.00  Female    Yes   Sat  Dinner     2
241       22.67  2.00    Male    Yes   Sat  Dinner     2
242       17.82  1.75    Male     No   Sat  Dinner     2
243       18.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

Как Мастер импорта текста Excel, read_csv может принимать несколько параметров для указания способа разбора данных. Например, если данные разделены табуляцией и не имеют заголовков столбцов, команда pandas будет выглядеть так:

tips = pd.read_csv("tips.csv", sep="\t", header=None)

# alternatively, read_table is an alias to read_csv with tab delimiter
tips = pd.read_table("tips.csv", header=None)

Файлы Excel#

Excel открывает различные форматы файлов Excel двойным щелчком по ним или с помощью меню Open. В pandas вы используете специальные методы для чтения и записи из/в файлы Excel.

Давайте сначала создать новый файл Excel на основе tips dataframe в приведённом выше примере:

tips.to_excel("./tips.xlsx")

Если вы захотите впоследствии получить доступ к данным в tips.xlsx файла, вы можете прочитать его в свой модуль с помощью

tips_df = pd.read_excel("./tips.xlsx", index_col=0)

Вы только что прочитали файл Excel с помощью pandas!

Ограничение вывода#

Программы для работы с электронными таблицами показывают только один экран данных за раз с возможностью прокрутки, поэтому нет реальной необходимости ограничивать вывод. В pandas потребуется уделить больше внимания контролю отображения ваших DataFrameотображаются.

По умолчанию pandas будет обрезать вывод больших DataFrames для отображения первых и последних строк. Это можно переопределить с помощью изменение параметров pandas, или используя DataFrame.head() или DataFrame.tail().

In [8]: tips.head(5)
Out[8]: 
   total_bill   tip     sex smoker  day    time  size
0       16.99  1.01  Female     No  Sun  Dinner     2
1       10.34  1.66    Male     No  Sun  Dinner     3
2       21.01  3.50    Male     No  Sun  Dinner     3
3       23.68  3.31    Male     No  Sun  Dinner     2
4       24.59  3.61  Female     No  Sun  Dinner     4

Экспорт данных#

По умолчанию, настольное программное обеспечение для работы с электронными таблицами сохраняет в своем формате файла (.xlsx, .ods, и т.д.). Однако вы можете сохранить в другие форматы файлов.

pandas может создавать файлы Excel, CSV, или ряд других форматов.

Операции с данными#

Операции со столбцами#

В электронных таблицах, формулы часто создаются в отдельных ячейках, а затем перетаскиваемый в другие ячейки для вычисления их для других столбцов. В pandas вы можете выполнять операции над целыми столбцами напрямую.

pandas предоставляет векторизованные операции путем указания отдельных Series в DataFrameНовые столбцы могут быть назначены аналогичным образом. DataFrame.drop() метод удаляет столбец из DataFrame.

In [9]: tips["total_bill"] = tips["total_bill"] - 2

In [10]: tips["new_bill"] = tips["total_bill"] / 2

In [11]: tips
Out[11]: 
     total_bill   tip     sex smoker   day    time  size  new_bill
0         14.99  1.01  Female     No   Sun  Dinner     2     7.495
1          8.34  1.66    Male     No   Sun  Dinner     3     4.170
2         19.01  3.50    Male     No   Sun  Dinner     3     9.505
3         21.68  3.31    Male     No   Sun  Dinner     2    10.840
4         22.59  3.61  Female     No   Sun  Dinner     4    11.295
..          ...   ...     ...    ...   ...     ...   ...       ...
239       27.03  5.92    Male     No   Sat  Dinner     3    13.515
240       25.18  2.00  Female    Yes   Sat  Dinner     2    12.590
241       20.67  2.00    Male    Yes   Sat  Dinner     2    10.335
242       15.82  1.75    Male     No   Sat  Dinner     2     7.910
243       16.78  3.00  Female     No  Thur  Dinner     2     8.390

[244 rows x 8 columns]

In [12]: tips = tips.drop("new_bill", axis=1)

Обратите внимание, что нам не нужно указывать выполнять это вычитание поэлементно — pandas обрабатывает это за нас. См. как создавать новые столбцы на основе существующих.

Фильтрация#

В Excel фильтрация выполняется через графическое меню.

Screenshot showing filtering of the total_bill column to values greater than 10

DataFrames могут быть отфильтрованы несколькими способами; наиболее интуитивным из которых является использование булевую индексацию.

In [13]: tips[tips["total_bill"] > 10]
Out[13]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
5         23.29  4.71    Male     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[204 rows x 7 columns]

Приведённое выражение просто передаёт Series of True/False объекты в DataFrame, возвращая все строки с True.

In [14]: is_dinner = tips["time"] == "Dinner"

In [15]: is_dinner
Out[15]: 
0      True
1      True
2      True
3      True
4      True
       ... 
239    True
240    True
241    True
242    True
243    True
Name: time, Length: 244, dtype: bool

In [16]: is_dinner.value_counts()
Out[16]: 
time
True     176
False     68
Name: count, dtype: int64

In [17]: tips[is_dinner]
Out[17]: 
     total_bill   tip     sex smoker   day    time  size
0         14.99  1.01  Female     No   Sun  Dinner     2
1          8.34  1.66    Male     No   Sun  Dinner     3
2         19.01  3.50    Male     No   Sun  Dinner     3
3         21.68  3.31    Male     No   Sun  Dinner     2
4         22.59  3.61  Female     No   Sun  Dinner     4
..          ...   ...     ...    ...   ...     ...   ...
239       27.03  5.92    Male     No   Sat  Dinner     3
240       25.18  2.00  Female    Yes   Sat  Dinner     2
241       20.67  2.00    Male    Yes   Sat  Dinner     2
242       15.82  1.75    Male     No   Sat  Dinner     2
243       16.78  3.00  Female     No  Thur  Dinner     2

[176 rows x 7 columns]

Логика if/then#

Допустим, мы хотим создать bucket столбец со значениями low и high, в зависимости от того, является ли total_bill меньше или больше $10.

В электронных таблицах логическое сравнение можно выполнить с помощью условные формулы. Мы бы использовали формулу =IF(A2 < 10, "low", "high"), перетащены во все ячейки новой bucket столбец.

Screenshot showing the formula from above in a bucket column of the tips spreadsheet

Та же операция в pandas может быть выполнена с использованием where метод из numpy.

In [18]: tips["bucket"] = np.where(tips["total_bill"] < 10, "low", "high")

In [19]: tips
Out[19]: 
     total_bill   tip     sex smoker   day    time  size bucket
0         14.99  1.01  Female     No   Sun  Dinner     2   high
1          8.34  1.66    Male     No   Sun  Dinner     3    low
2         19.01  3.50    Male     No   Sun  Dinner     3   high
3         21.68  3.31    Male     No   Sun  Dinner     2   high
4         22.59  3.61  Female     No   Sun  Dinner     4   high
..          ...   ...     ...    ...   ...     ...   ...    ...
239       27.03  5.92    Male     No   Sat  Dinner     3   high
240       25.18  2.00  Female    Yes   Sat  Dinner     2   high
241       20.67  2.00    Male    Yes   Sat  Dinner     2   high
242       15.82  1.75    Male     No   Sat  Dinner     2   high
243       16.78  3.00  Female     No  Thur  Dinner     2   high

[244 rows x 8 columns]

Функциональность дат#

В этом разделе будут упоминаться «даты», но временные метки обрабатываются аналогично.

Мы можем рассматривать функциональность даты в двух частях: парсинг и вывод. В электронных таблицах значения даты обычно парсятся автоматически, хотя существует DATEVALUE функцию, если она вам нужна. В pandas необходимо явно преобразовывать обычный текст в объекты datetime, либо при чтении из CSV или один раз в DataFrame.

После парсинга электронные таблицы отображают даты в формате по умолчанию, хотя формат может быть изменен. В pandas обычно рекомендуется хранить даты как datetime объекты во время выполнения вычислений с ними. Вывод части извлечение частей дат (например, года) выполняется через функции даты в электронных таблицах, и свойства datetime в pandas.

Учитывая date1 и date2 в столбцах A и B электронной таблицы, у вас могут быть эти формулы:

столбец

формула

date1_year

=YEAR(A2)

date2_month

=MONTH(B2)

date1_next

=DATE(YEAR(A2),MONTH(A2)+1,1)

months_between

=DATEDIF(A2,B2,"M")

Эквивалентные операции pandas показаны ниже.

In [20]: tips["date1"] = pd.Timestamp("2013-01-15")

In [21]: tips["date2"] = pd.Timestamp("2015-02-15")

In [22]: tips["date1_year"] = tips["date1"].dt.year

In [23]: tips["date2_month"] = tips["date2"].dt.month

In [24]: tips["date1_next"] = tips["date1"] + pd.offsets.MonthBegin()

In [25]: tips["months_between"] = tips["date2"].dt.to_period("M") - tips[
   ....:     "date1"
   ....: ].dt.to_period("M")
   ....: 

In [26]: tips[
   ....:     ["date1", "date2", "date1_year", "date2_month", "date1_next", "months_between"]
   ....: ]
   ....: 
Out[26]: 
         date1      date2  date1_year  date2_month date1_next    months_between
0   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
1   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
2   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
3   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
4   2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
..         ...        ...         ...          ...        ...               ...
239 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
240 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
241 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
242 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>
243 2013-01-15 2015-02-15        2013            2 2013-02-01  <25 * MonthEnds>

[244 rows x 6 columns]

См. Функциональность временных рядов / работы с датами для получения дополнительной информации.

Выбор столбцов#

В электронных таблицах вы можете выбрать нужные столбцы с помощью:

Поскольку столбцы электронных таблиц обычно named in a header rowпереименование столбца — это просто изменение текста в первой ячейке.

Те же операции выражены в pandas ниже.

Оставить определенные столбцы#

In [27]: tips[["sex", "total_bill", "tip"]]
Out[27]: 
        sex  total_bill   tip
0    Female       14.99  1.01
1      Male        8.34  1.66
2      Male       19.01  3.50
3      Male       21.68  3.31
4    Female       22.59  3.61
..      ...         ...   ...
239    Male       27.03  5.92
240  Female       25.18  2.00
241    Male       20.67  2.00
242    Male       15.82  1.75
243  Female       16.78  3.00

[244 rows x 3 columns]

Удалить столбец#

In [28]: tips.drop("sex", axis=1)
Out[28]: 
     total_bill   tip smoker   day    time  size
0         14.99  1.01     No   Sun  Dinner     2
1          8.34  1.66     No   Sun  Dinner     3
2         19.01  3.50     No   Sun  Dinner     3
3         21.68  3.31     No   Sun  Dinner     2
4         22.59  3.61     No   Sun  Dinner     4
..          ...   ...    ...   ...     ...   ...
239       27.03  5.92     No   Sat  Dinner     3
240       25.18  2.00    Yes   Sat  Dinner     2
241       20.67  2.00    Yes   Sat  Dinner     2
242       15.82  1.75     No   Sat  Dinner     2
243       16.78  3.00     No  Thur  Dinner     2

[244 rows x 6 columns]

Переименовать столбец#

In [29]: tips.rename(columns={"total_bill": "total_bill_2"})
Out[29]: 
     total_bill_2   tip     sex smoker   day    time  size
0           14.99  1.01  Female     No   Sun  Dinner     2
1            8.34  1.66    Male     No   Sun  Dinner     3
2           19.01  3.50    Male     No   Sun  Dinner     3
3           21.68  3.31    Male     No   Sun  Dinner     2
4           22.59  3.61  Female     No   Sun  Dinner     4
..            ...   ...     ...    ...   ...     ...   ...
239         27.03  5.92    Male     No   Sat  Dinner     3
240         25.18  2.00  Female    Yes   Sat  Dinner     2
241         20.67  2.00    Male    Yes   Sat  Dinner     2
242         15.82  1.75    Male     No   Sat  Dinner     2
243         16.78  3.00  Female     No  Thur  Dinner     2

[244 rows x 7 columns]

Сортировка по значениям#

Сортировка в электронных таблицах выполняется с помощью диалог сортировки.

Screenshot of dialog from Excel showing sorting by the sex then total_bill columns

pandas имеет DataFrame.sort_values() метода, который принимает список столбцов для сортировки.

In [30]: tips = tips.sort_values(["sex", "total_bill"])

In [31]: tips
Out[31]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

Обработка строк#

Определение длины строки#

В электронных таблицах количество символов в тексте можно найти с помощью LEN функция. Это можно использовать с TRIM функция для удаления лишних пробелов.

=LEN(TRIM(A2))

Вы можете найти длину строки символов с помощью Series.str.len(). В Python 3 все строки являются строками Unicode. len включает завершающие пробелы. Используйте len и rstrip для исключения завершающих пробелов.

In [32]: tips["time"].str.len()
Out[32]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

In [33]: tips["time"].str.rstrip().str.len()
Out[33]: 
67     6
92     6
111    6
145    5
135    5
      ..
182    6
156    6
59     6
212    6
170    6
Name: time, Length: 244, dtype: int64

Обратите внимание, что это все равно будет включать несколько пробелов внутри строки, поэтому не является 100% эквивалентом.

Поиск позиции подстроки#

The FIND функция электронной таблицы возвращает позицию подстроки, где первый символ имеет 1.

Screenshot of FIND formula being used in Excel

Вы можете найти позицию символа в столбце строк с помощью Series.str.find() метод. find ищет первую позицию подстроки. Если подстрока найдена, метод возвращает её позицию. Если не найдена, возвращает -1Имейте в виду, что индексы в Python начинаются с нуля.

In [34]: tips["sex"].str.find("ale")
Out[34]: 
67     3
92     3
111    3
145    3
135    3
      ..
182    1
156    1
59     1
212    1
170    1
Name: sex, Length: 244, dtype: int64

Извлечение подстроки по позиции#

Электронные таблицы имеют MID формула для извлечения подстроки из заданной позиции. Чтобы получить первый символ:

=MID(A2,1,1)

С pandas вы можете использовать [] нотация для извлечения подстроки из строки по позициям. Помните, что в Python индексация начинается с нуля.

In [35]: tips["sex"].str[0:1]
Out[35]: 
67     F
92     F
111    F
145    F
135    F
      ..
182    M
156    M
59     M
212    M
170    M
Name: sex, Length: 244, dtype: object

Извлечение n-го слова#

В Excel вы можете использовать Мастер разбора текста по столбцам для разделения текста и извлечения определенного столбца. (Примечание это также возможно сделать через формулу.)

Самый простой способ извлечь слова в pandas — разделить строки по пробелам, затем обратиться к слову по индексу. Обратите внимание, что существуют более мощные подходы, если они вам понадобятся.

In [36]: firstlast = pd.DataFrame({"String": ["John Smith", "Jane Cook"]})

In [37]: firstlast["First_Name"] = firstlast["String"].str.split(" ", expand=True)[0]

In [38]: firstlast["Last_Name"] = firstlast["String"].str.rsplit(" ", expand=True)[1]

In [39]: firstlast
Out[39]: 
       String First_Name Last_Name
0  John Smith       John     Smith
1   Jane Cook       Jane      Cook

Изменение регистра#

Электронные таблицы предоставляют Функции UPPER, LOWER и PROPER для преобразования текста в верхний, нижний и заглавный регистр соответственно.

Эквивалентные методы pandas: Series.str.upper(), Series.str.lower(), и Series.str.title().

In [40]: firstlast = pd.DataFrame({"string": ["John Smith", "Jane Cook"]})

In [41]: firstlast["upper"] = firstlast["string"].str.upper()

In [42]: firstlast["lower"] = firstlast["string"].str.lower()

In [43]: firstlast["title"] = firstlast["string"].str.title()

In [44]: firstlast
Out[44]: 
       string       upper       lower       title
0  John Smith  JOHN SMITH  john smith  John Smith
1   Jane Cook   JANE COOK   jane cook   Jane Cook

Слияние#

Следующие таблицы будут использоваться в примерах слияния:

In [45]: df1 = pd.DataFrame({"key": ["A", "B", "C", "D"], "value": np.random.randn(4)})

In [46]: df1
Out[46]: 
  key     value
0   A  0.469112
1   B -0.282863
2   C -1.509059
3   D -1.135632

In [47]: df2 = pd.DataFrame({"key": ["B", "D", "D", "E"], "value": np.random.randn(4)})

In [48]: df2
Out[48]: 
  key     value
0   B  1.212112
1   D -0.173215
2   D  0.119209
3   E -1.044236

В Excel есть объединение таблиц можно выполнить с помощью VLOOKUP.

Screenshot showing a VLOOKUP formula between two tables in Excel, with some values being filled in and others with "#N/A"

pandas DataFrames имеют merge() метод, который предоставляет аналогичную функциональность. Данные не нужно предварительно сортировать, а различные типы объединений выполняются с помощью how ключевое слово.

In [49]: inner_join = df1.merge(df2, on=["key"], how="inner")

In [50]: inner_join
Out[50]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209

In [51]: left_join = df1.merge(df2, on=["key"], how="left")

In [52]: left_join
Out[52]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209

In [53]: right_join = df1.merge(df2, on=["key"], how="right")

In [54]: right_join
Out[54]: 
  key   value_x   value_y
0   B -0.282863  1.212112
1   D -1.135632 -0.173215
2   D -1.135632  0.119209
3   E       NaN -1.044236

In [55]: outer_join = df1.merge(df2, on=["key"], how="outer")

In [56]: outer_join
Out[56]: 
  key   value_x   value_y
0   A  0.469112       NaN
1   B -0.282863  1.212112
2   C -1.509059       NaN
3   D -1.135632 -0.173215
4   D -1.135632  0.119209
5   E       NaN -1.044236

merge имеет ряд преимуществ по сравнению с VLOOKUP:

  • Искомое значение не обязательно должно быть первым столбцом таблицы поиска

  • Если сопоставлено несколько строк, будет одна строка для каждого совпадения, а не только первая

  • Он будет включать все столбцы из таблицы поиска, а не только один указанный столбец

  • Он поддерживает более сложные операции соединения

Другие соображения#

маркер заполнения#

Создание серии чисел, следующих заданному шаблону в определенном диапазоне ячеек. В электронной таблице это делается с помощью shift+перетаскивания после ввода первого числа или путем ввода первых двух или трех значений и последующего перетаскивания.

Это можно достичь, создав серию и назначив ее нужным ячейкам.

In [57]: df = pd.DataFrame({"AAA": [1] * 8, "BBB": list(range(0, 8))})

In [58]: df
Out[58]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    1    3
4    1    4
5    1    5
6    1    6
7    1    7

In [59]: series = list(range(1, 5))

In [60]: series
Out[60]: [1, 2, 3, 4]

In [61]: df.loc[2:5, "AAA"] = series

In [62]: df
Out[62]: 
   AAA  BBB
0    1    0
1    1    1
2    1    2
3    2    3
4    3    4
5    4    5
6    1    6
7    1    7

Удалить дубликаты#

Excel имеет встроенную функциональность для удаление дублирующихся значений. Это поддерживается в pandas через drop_duplicates().

In [63]: df = pd.DataFrame(
   ....:     {
   ....:         "class": ["A", "A", "A", "B", "C", "D"],
   ....:         "student_count": [42, 35, 42, 50, 47, 45],
   ....:         "all_pass": ["Yes", "Yes", "Yes", "No", "No", "Yes"],
   ....:     }
   ....: )
   ....: 

In [64]: df.drop_duplicates()
Out[64]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [65]: df.drop_duplicates(["class", "student_count"])
Out[65]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

Сводные таблицы#

PivotTables из электронных таблиц можно воспроизвести в pandas через Преобразование формы и сводные таблицы. Используя tips Снова используя набор данных, найдем средние чаевые по размеру компании и полу официанта.

В Excel мы используем следующую конфигурацию для сводной таблицы:

Screenshot showing a PivotTable in Excel, using sex as the column, size as the rows, then average tip as the values

Эквивалент в pandas:

In [66]: pd.pivot_table(
   ....:     tips, values="tip", index=["size"], columns=["sex"], aggfunc=np.average
   ....: )
   ....: 
Out[66]: 
sex     Female      Male
size                    
1     1.276667  1.920000
2     2.528448  2.614184
3     3.250000  3.476667
4     4.021111  4.172143
5     5.140000  3.750000
6     4.600000  5.850000

Добавление строки#

Предполагая, что мы используем RangeIndex (пронумерованные 0, 1, и т.д.), мы можем использовать concat() для добавления строки в конец DataFrame.

In [67]: df
Out[67]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes

In [68]: new_row = pd.DataFrame([["E", 51, True]],
   ....:                        columns=["class", "student_count", "all_pass"])
   ....: 

In [69]: pd.concat([df, new_row])
Out[69]: 
  class  student_count all_pass
0     A             42      Yes
1     A             35      Yes
2     A             42      Yes
3     B             50       No
4     C             47       No
5     D             45      Yes
0     E             51     True

Найти и заменить#

диалоговое окно "Найти" Excel переводит вас к ячейкам, которые совпадают, по одной. В pandas эта операция обычно выполняется для целого столбца или DataFrame одновременно через условные выражения.

In [70]: tips
Out[70]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]

In [71]: tips == "Sun"
Out[71]: 
     total_bill    tip    sex  smoker    day   time   size
67        False  False  False   False  False  False  False
92        False  False  False   False  False  False  False
111       False  False  False   False  False  False  False
145       False  False  False   False  False  False  False
135       False  False  False   False  False  False  False
..          ...    ...    ...     ...    ...    ...    ...
182       False  False  False   False   True  False  False
156       False  False  False   False   True  False  False
59        False  False  False   False  False  False  False
212       False  False  False   False  False  False  False
170       False  False  False   False  False  False  False

[244 rows x 7 columns]

In [72]: tips["day"].str.contains("S")
Out[72]: 
67      True
92     False
111     True
145    False
135    False
       ...  
182     True
156     True
59      True
212     True
170     True
Name: day, Length: 244, dtype: bool

pandas' replace() сопоставимо с функцией Excel Replace All.

In [73]: tips.replace("Thu", "Thursday")
Out[73]: 
     total_bill    tip     sex smoker   day    time  size
67         1.07   1.00  Female    Yes   Sat  Dinner     1
92         3.75   1.00  Female    Yes   Fri  Dinner     2
111        5.25   1.00  Female     No   Sat  Dinner     1
145        6.35   1.50  Female     No  Thur   Lunch     2
135        6.51   1.25  Female     No  Thur   Lunch     2
..          ...    ...     ...    ...   ...     ...   ...
182       43.35   3.50    Male    Yes   Sun  Dinner     3
156       46.17   5.00    Male     No   Sun  Dinner     6
59        46.27   6.73    Male     No   Sat  Dinner     4
212       46.33   9.00    Male     No   Sat  Dinner     4
170       48.81  10.00    Male    Yes   Sat  Dinner     3

[244 rows x 7 columns]