Объем структурированных табличных данных увеличивается с каждым днем. Именно поэтому дата-сайентисту так важно уметь анализировать табличные данные с помощью Pandas. Хотя самообучение — отличный способ повысить квалификацию, иногда может пригодиться и опыт коллег, которые быстрее нашли ответы на актуальные вопросы.
Хотите продвинуться в этом направлении и “прокачать” навыки работы в Pandas? Сделать это вам помогут решения, которые отвечают на десять вопросов из категории Pandas на StackOverflow, собравших наибольшее количество голосов.
Код для этой статьи можно найти здесь.
Примечание: Приведенные здесь решения созданы автором Avi Chawla. Весь пользовательский контент на StackOverflow лицензирован для коммерческого применения (CC BY 4.0) и доступен для свободного использования.
1. Как выполнить итерации по строкам в Pandas DataFrame?
Итерация (также известная как цикл) — посещение каждой строки в DataFrame по отдельности с выполнением определенной операции.
Рассмотрим приведенный ниже DataFrame:
df = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns = ["col1", "col2"])
print(df)
col1 col2
0 1 A
1 2 B
2 3 C
В Pandas можно выполнять итерацию тремя способами, используя range(len(df))
, iterrows()
и itertuples()
.
print("Method 1:", end = " ")
for index in range(len(df)):
print(df["col1"][index], end = " ")
print("\nMethod 2:", end = " ")
for index, row in df.iterrows():
print(row["col1"], end = " ")
print("\nMethod 3:", end = " ")
for row in df.itertuples():
print(row.col1, end = " ")
Method 1: 1 2 3
Method 2: 1 2 3
Method 3: 1 2 3
2. Как выбрать строки из DataFrame на основе значений столбцов?
Этот вопрос касается проблемы фильтрации DataFrame на основе условия. Чтобы ознакомиться с популярными методами фильтрации, рассмотрите приведенный ниже DataFrame:
df = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns = ["col1", "col2"])
print(df)
col1 col2
0 1 A
1 2 B
2 3 C
Некоторые методы фильтрации DataFrame реализованы ниже:
## Method 1: Filter on one column
print(df[df.col1>2])
## Method 2: Filter on multiple columns
print(df[df.col1>1][df.col2 == "B"])
## Method 3: Filter from list
print(df[df.col2.isin(["A", "B"])])
## Method 4: using df.query()
print(df.query('col1 > 2'))
col1 col2
2 3 C
col1 col2
1 2 B
col1 col2
0 1 A
1 2 B
col1 col2
2 3 C
- Метод 1: фильтрация по одному столбцу.
- Метод 2: фильтрация по нескольким столбцам.
- Метод 3: фильтрация из списка.
- Метод 4: использование
df.query()
.
Метод isin()
, использованный выше, принимает список значений фильтрации. С другой стороны, метод query()
оценивает строковое выражение для фильтрации строк из DataFrame.
3. Как переименовать столбцы в Pandas?
В данном случае задача состоит в том, чтобы изменить имена заголовков столбцов. Рассмотрим тот же DataFrame, что и выше.
df = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns = ["col1", "col2"])
print(df)
col1 col2
0 1 A
1 2 B
2 3 C
Можно изменить имя col1
на col3
с помощью метода rename()
следующим образом:
print(df.rename(columns = {"col1":"col3"}))
col3 col2
0 1 A
1 2 B
2 3 C
В этом случае исходный DataFrame остается неизменным. Если не нужно создавать новый DataFrame, используйте inplace=True
, как показано ниже:
df.rename(columns = {"col1":"col3"}, inplace = True)
print(df)
col3 col2
0 1 A
1 2 B
2 3 C
При использовании метода rename()
нужно создать мэппинг от old-column-name
к new-column-name
в виде словаря. Если имя столбца должно быть оставлено без изменений, его не нужно указывать в словаре.
4. Как удалить столбец из Pandas DataFrame?
Чтобы удалить один или несколько столбцов из DataFrame, можно использовать метод drop()
и передать в виде списка столбцы, которые нужно удалить. Это показано в Method 1
и Method 2
ниже. В качестве альтернативы, как показано в Method 3
, можно выбрать подмножество столбцов, которые нужно сохранить в конечном DataFrame.
df = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns = ["col1", "col2"])
print(df)
col1 col2
0 1 A
1 2 B
2 3 C
## Method 1: Create a new DataFrame
print(df.drop(columns = ["col1"]), end = "\n\n")
## Method 2: Drop columns from the original DataFrame
df.drop(columns = ["col1"], inplace = True)
print(df, end = "\n\n")
## Method 3: Select the required columns
df = df[["col2"]]
print(df)
col2
0 A
1 B
2 C
col2
0 A
1 B
2 C
col2
0 A
1 B
2 C
- Метод 1: создайте новый DataFrame.
- Метод 2: удалите столбцы из исходного DataFrame.
- Метод 3: выберите необходимые столбцы.
Синтаксис метода drop()
аналогичен синтаксису метода rename()
, с той лишь разницей, что аргумент columns
принимает список столбцов, которые нужно удалить.
5. Как получить количество строк в Pandas DataFrame?
Этот вопрос ориентирован на знание формы Pandas DataFrame. Чтобы ответить на него, рассмотрим следующий DataFrame с тремя строками и двумя столбцами:
df = pd.DataFrame([[1, "A"], [2, "B"], [3, "C"]], columns = ["col1", "col2"])
print(df)
col1 col2
0 1 A
1 2 B
2 3 C
Чтобы найти форму, используйте атрибут shape
для DataFrame следующим образом:
print("Shape of the DataFrame:", df.shape)
print("Number of rows:", df.shape[0])
print("Number of columns:", df.shape[1])
Shape of the DataFrame: (3, 2)
Number of rows: 3
Number of columns: 2
Атрибут shape
возвращает кортеж python
. Первый элемент соответствует количеству строк, а второй обозначает количество столбцов.
6. Как выбрать несколько столбцов в Pandas DataFrame?
Суть данной задачи заключается в том, чтобы выбрать более одного столбца из DataFrame для дальнейшей обработки. Например, если исходный DataFrame состоит из трех столбцов, а именно col1
, col2
и col3
, как выбрать только col1
и col3
?
df = pd.DataFrame([[1, "A", 1.1], [2, "B", 1.4], [3, "C", 1.9]], columns = ["col1", "col2", "col3"])
print(df)
col1 col2 col3
0 1 A 1.1
1 2 B 1.4
2 3 C 1.9
Это можно сделать двумя способами:
## Method 1: select the required columns
df_filtered = df[["col1", "col3"]]
print(df_filtered)
## Method 2: Using column indexes in iloc[]
df_filtered = df.iloc[:, [0,2]]
print(df_filtered)
col1 col3
0 1 1.1
1 2 1.4
2 3 1.9
col1 col3
0 1 1.1
1 2 1.4
2 3 1.9
- Метод 1: выберите требуемые столбцы.
- Метод 2: используйте индексы столбцов в
iloc[]
.
Список [0,2]
в iloc
интерпретируется как столбцы, расположенные под 0-м (col1
) и 2-м (col3
) индексами.
7. Как изменить порядок столбцов DataFrame?
Изменение порядка столбцов в DataFrame означает перестановку столбцов без изменения их количества (или формы DataFrame).
Рассмотрим приведенный ниже DataFrame. Задача состоит в том, чтобы расположить столбцы в порядке col1
—col2
—col3
.
df = pd.DataFrame([[1, "A", 1.1], [2, "B", 1.4], [3, "C", 1.9]],
columns = ["col2", "col3", "col1"])
print(df)
col2 col3 col1
0 1 A 1.1
1 2 B 1.4
2 3 C 1.9
Это можно сделать двумя способами:
## Method 1: select all the columns in order
df_new = df[["col1", "col2", "col3"]]
print(df_new)
## Method 2: Using all column indexes in iloc[]
df_new = df.iloc[:, [2,0,1]]
print(df_new)
col1 col2 col3
0 1.1 1 A
1 1.4 2 B
2 1.9 3 C
col1 col2 col3
0 1.1 1 A
1 1.4 2 B
2 1.9 3 C
- Метод 1: выберите все столбцы по порядку.
- Метод 2: используйте все индексы столбцов в
iloc[]
.
Список [2,0,1]
в iloc
интерпретируется как столбцы, расположенные под 2-м (col1
), 0-м (col2
) и 1-м (col3
) индексами.
8. Как изменить тип столбца в Pandas?
Цель этого вопроса — узнать, как изменить тип данных столбца. Рассмотрим приведенный ниже DataFrame, в котором col1
содержит целочисленные значения в виде строк.
df = pd.DataFrame([["1", "A"], ["2", "B"], [3, "C"]],
columns = ["col1", "col2"])
print(df)
print("Data Type of col1:", df.col1.dtype)
col1 col2
0 1 A
1 2 B
2 3 C
Data Type of col1: object
Текущий тип данных col1
— это object
(то же самое, что и string
). Задача состоит в том, чтобы изменить тип данных col1
со string
на integer
. Изменить тип данных можно следующим образом:
df["new_col1"] = df["col1"].astype(int)
print(df)
print("Data Type of new_col1:", df.new_col1.dtype)
col1 col2 new_col1
0 1 A 1
1 2 B 2
2 3 C 3
Data Type of new_col1: int64
Чтобы не создавать столбец, можно хранить новые значения в том же столбце:
df["col1"] = df["col1"].astype(int)
print(df)
print("Data Type of col1:", df.col1.dtype)
col1 col2 new_col1
0 1 A 1
1 2 B 2
2 3 C 3
Data Type of col1: int64
При использовании метода astype()
необходимо убедиться в том, что преобразование исходного типа данных в целевой выполнимо. Например, нельзя преобразовать столбец string
алфавитов в тип данных integer
(целочисленный) или float
(плавающий).
9. Как получить список из заголовков столбцов Pandas DataFrame?
Задача состоит в том, чтобы получить названия всех столбцов в DataFrame в виде списка. Рассмотрим приведенный ниже DataFrame:
df = pd.DataFrame([[1, "A", 1.1], [2, "B", 1.4], [3, "C", 1.9]],
columns = ["col1", "col2", "col3"])
print(df)
col1 col2 col3
0 1 A 1.1
1 2 B 1.4
2 3 C 1.9
Чтобы получить список столбцов, используйте атрибут columns
, как показано ниже:
print("All column names:", df.columns)
print("Type of df.columns: ", type(df.columns))
All column names: Index(['col1', 'col2', 'col3'], dtype='object')
Type of df.columns: <class 'pandas.core.indexes.base.Index'>
Вышеуказанное возвращает столбец как объект Index
. Чтобы получить его в виде списка, приведите полученные результаты к списку:
list(df.columns)
['col1', 'col2', 'col3']
10. Как создать Pandas Dataframe путем добавления одной строки за раз?
В этом вопросе задача заключается в том, чтобы добавлять одну строку за раз к изначально пустому DataFrame. Предположим, что у нас есть приведенный ниже пустой DataFrame и список списков data
, где каждый отдельный подсписок будет добавлен в DataFrame в виде строки.
df = pd.DataFrame(columns = ["col1", "col2", "col3"])
print(df)
data = [[1, "A", 1.1], [2, "B", 1.4], [3, "C", 1.9]]
Empty DataFrame
Columns: [col1, col2, col3]
Index: []
Чтобы добавлять по одной строке за раз, нужно выполнить итерацию по списку data
и добавить новую строку следующим образом:
for i in data:
df.loc[df.shape[0]] = i
print(df)
col1 col2 col3
0 1 A 1.1
1 2 B 1.4
2 3 C 1.9
Как обсуждалось выше в вопросе 5, первый элемент кортежа, возвращаемого атрибутом shape
, обозначает количество строк в DataFrame. Поэтому каждая новая строка, добавленная в DataFrame, обеспечивает создание нового индекса для следующей строки.
Читайте также:
- Как превратить Google Таблицы в базу данных с помощью Python
- Эффективное итерирование по строкам в Pandas DataFrame
- Руководство по созданию интерактивных визуализаций на Python
Читайте нас в Telegram, VK и Дзен
Перевод статьи Avi Chawla: 10 Pandas Questions Asked a Decade Ago on StackOverflow That Are Still Relevant Today