Источник: Nuances of Programming
Объем структурированных табличных данных увеличивается с каждым днем. Именно поэтому дата-сайентисту так важно уметь анализировать табличные данные с помощью 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, обеспечивает создание нового индекса для следующей строки.
Читайте также:
Перевод статьи Avi Chawla: 10 Pandas Questions Asked a Decade Ago on StackOverflow That Are Still Relevant Today