Перебор строк датафрейма в Pandas (Python)
Необходимо написать функцию, которая будет принимать каждую строку датафрейма, и возвращать названия столбцов (со значением 1) в виде списка. Допустим, есть датафрейм:
import pandas as pd inp = [, , ] df = pd.DataFrame(inp) print(df)
name A B ab 1 1 cd 0 1 ef 1 1
Нужно написать функцию, чтобы она принимала каждую строку и возвращала названия столбцов со значением 1 в виде списка. У меня уже есть отдельная переменная columns = [‘A’, ‘B’] , содержащая все названия столбцов кроме первого в виде списка. В идеале для первой строки должен быть выход list = [‘A’, ‘B’] , так как оба столбца первой строчки равны единице. Что у меня получилось:
def func(columns): for i in columns: list=[] for j in df[i]: if j == 1: list.append(i) return list
Но получается, что она каждый раз возвращает названия столбцов отдельными списками. Понимаю, что порядок изначально не тот, но не могу придумать, как поменять местами список columns и df[i]. В итоге забрел в тупик.
7 полезных операций в Pandas при работе с DataFrame
Абстракция датафрейма является одной из наиболее полезных концепций в современной экосистеме управления данными. Вращается она главным образом вокруг табличных структур, которые имеют повышенную производительность при обновлении и запросе данных различными способами. Сериализация/десериализация этих структур из/в различные форматы файлов упрощает работу с данными. Более того, возможность производить различные SQL-подобные операции, такие как объединение, наряду с выполнением математических вычислений в самом датафрейме существенно расширяет возможности программиста.
Эта статья подчеркивает некоторые наиболее полезные операции, которые можно выполнять с помощью абстракции датафрейма. Реализовывать мы их будем через библиотеку Pandas. Постараюсь представить материал в интуитивно понятной форме, чтобы в дальнейшем вы могли применить эти знания в других случаях или при работе с другими фреймворками.
1. Конкатенация DataFrame
Есть два способа конкатенировать датафрейм A и B . Представьте их как проиндексированные таблицы. Эти две таблицы можно объединить либо по оси y, либо по оси x.
Если требуется конкатенировать их вдоль x, то вызов API будет таким:
import pandas as pdpd.concat([A, B], axis=1)
Если же вдоль y, то таким:
import pandas as pdpd.concat([A, B]) # по умолчанию axis = 0
Применение
Предположим, у вас есть большое количество CSV-файлов или XLSX-данных, которые нужно присоединить друг к другу. Одним из способов сделать это будет считать данные файлов в датафреймы и использовать инструкцию pd.concat([file_1, file_2]) . Программно можно перебрать имена файлов (используя модуль glob для чтения набора имен файлов с помощью техники сопоставления шаблонов, например regex), считать их в датафрейм, соединить в памяти и сериализовать конкатенированные датафреймы в нужный формат файлов.
Вариант с axis = 0 используется нечасто, но его можно применять в сценариях, когда нужно обработать массивы данных, собранных с упорядочиванием. То есть, когда последовательность данных соответствует последовательности других массивов данных. В таком случае эти массивы можно объединить вдоль оси x, получив более объемное и значительное представление в табличном формате. Затем к полученной структуре можно применять операции, использующие все типы данных в ее столбцах.
2. Разделение DataFrame
Датафрейм можно разделить множеством способов, и выбор техники полностью зависит от цели этого разделения. Рассмотрим ряд случаев.
Просмотр сведений
В некоторых сценариях, особенно при написании кода с помощью блокнотов (например Jupyter), мы заглядываем в датафрейм, только чтобы понять, как он выглядит. В таких случаях можно использовать метод head() .
import pandas as pdprint(df.head(10)) # выводит первые 10 строк dataframe
Исключение столбцов
Этот метод разделяет датафрейм вдоль оси y, то есть просто выбрасывает из него часть столбцов. Используется данный метод в типичном сценарии, когда нам не нужно, чтобы конечный DataFrame содержал эти столбцы, или когда мы предполагаем, что при дальнейшем обновлении структура станет занимать слишком много памяти.
import pandas as pddf.drop('COLUMN_NAME', inplace=True, axis=1)
# указывает, что 'COLUMN_NAME' находится на оси x
Удаление датафреймов друг из друга
Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , и датафрейм Y , состоящий из подмножества столбцов X . Нам нужно удалить Y из X . Это можно сделать так:
import pandas as pdpd.concat([X, Y]).drop_duplicates(keep=False)
Конкатенация этих датафреймов приведет к дублированию общих записей, которые в итоге будут удалены выражением keep = false функции drop_duplicates() .
Применение
Предположим, что столбец A — это определенный вид ID сведений о работнике. К примеру, датафрейм X состоит из всех данных о работниках, а датафрейм Y содержит данные (с той же структурой) о работниках, не разбирающихся в Python. Нам нужно отфильтровать сведения о сотрудниках, которые не знакомы с Python.
Определение дельты записей на основе столбца
Представим, что у нас есть датафрейм X , состоящий из столбцов [A, B, C, D] , а также датафрейм Y , состоящий из тех же столбцов. При этом некоторые элементы столбцов A этих датафреймов являются общими. Нам нужно получить из датафрейма X строки, которые не содержат значения из столбца A , находящиеся в столбце A датафрейма Y .
import pandas as pdX[~X['A'].isin(Y['A'])]
Применение
Взгляните на эту таблицу:
Эти пары могли быть сгенерированы, например, из двух журналов: старого и нового. Нам нужно найти пары ID, принадлежащие одному и тому же человеку. Предположим, что ваш отдел кадров неожиданно заявляет, что определенный список ( hr_list ) сотрудников с ID_1 больше в компании не работает. Как удалить их из этого датафрейма?
import pandas as pdfiltered_pairs = employee_pairs[~employee_pairs['ID_1'].isin(hr_list)]
Разделение на основе значений столбцов
Датафрейм можно фильтровать на основе значений столбца. В этом случае критерий отбора может включать несколько выражений при условии, что они будут возвращать логические значения.
import pandas as pdfiltered_df = df[~df['A'].isna() & (df['B'] > 10)]
# Возвращает строки, где столбец A не null, а значение столбца B больше 10.
Это простейший пример.
3. Подсчет записей в столбце
Это эффективный способ определения количества различных элементов в столбце.
Ответ на приведенный выше запрос можно получить следующим подходом:
import pandas as pd
df = df[ (1984 df.columns = ['Contry', 'Count'] "nbformat": 4,
"nbformat_minor": 0,
"metadata": "colab": "name": "Host Countries.ipynb",
"provenance": []
>,
"kernelspec": "name": "python3",
"display_name": "Python 3"
>
>,
"cells": [
"cell_type": "code",
"metadata": "id": "502dBbjWHq89"
>,
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_excel('Asia Cup Winners in Cricket.xlsx')"
],
"execution_count": null,
"outputs": []
>,
"cell_type": "code",
"metadata": "colab": "base_uri": "https://localhost:8080/"
>,
"id": "14WfNdQRIjWw",
"outputId": "2b1e8cc9-75c1-40a5-8d2b-b45ed1641723"
>,
"source": [
"df.shape"
],
"execution_count": null,
"outputs": [
"output_type": "execute_result",
"data": "text/plain": [
"(13, 7)"
]
>,
"metadata": "tags": []
>,
"execution_count": 9
>
]
>,
"cell_type": "code",
"metadata": "id": "eSwxxIeTH90N"
>,
"source": [
"df = df[ (1984 ],
"execution_count": null,
"outputs": []
>,
"cell_type": "code",
"metadata": "colab": "base_uri": "https://localhost:8080/"
>,
"id": "1X6LwBL-IBcB",
"outputId": "9277501d-c02e-4345-a38c-66371d50979d"
>,
"source": [
"df.shape"
],
"execution_count": null,
"outputs": [
"output_type": "execute_result",
"data": "text/plain": [
"(12, 7)"
]
>,
"metadata": "tags": []
>,
"execution_count": 11
>
]
>,
"cell_type": "code",
"metadata": "id": "ZC1nYNy1IaT5"
>,
"source": [
"df = df['Host'].value_counts().reset_index()\n",
"df.columns = ['Country', 'Counts']"
],
"execution_count": null,
"outputs": []
>,
"cell_type": "code",
"metadata": "colab": "base_uri": "https://localhost:8080/",
"height": 204
>,
"id": "PdFw0MMkIwDH",
"outputId": "8daa83cb-af9f-41aa-b3e9-71d6a948de51"
>,
"source": [
"df"
],
"execution_count": null,
"outputs": [
"output_type": "execute_result",
"data": "text/html": [
"\n","
"\n",
"\n",
\n",
"\n", \n",
" \n",
"Country \n",
"Counts \n",
"
" \n",
" \n",
"\n", \n",
"0 \n",
"Sri Lanka \n",
"4 \n",
"
"\n", \n",
"1 \n",
"Bangladesh \n",
"4 \n",
"
"\n", \n",
"2 \n",
"UAE \n",
"2 \n",
"
"\n", \n",
"3 \n",
"Pakistan \n",
"1 \n",
"
"\n", \n",
"4 \n",
"India \n",
"1 \n",
"
" \n",
"
"
],
"text/plain": [
" Country Counts\n",
"0 Sri Lanka 4\n",
"1 Bangladesh 4\n",
"2 UAE 2\n",
"3 Pakistan 1\n",
"4 India 1"
]
>,
"metadata": "tags": []
>,
"execution_count": 13
>
]
>
]
>
4. Чтение фрагментов DataFrame
В некоторых случаях будет более эффективно считывать только части датафрейма, особенно при его больших размерах. Обратите внимание, что каждый датафрейм является индексированной табличной структурой, находящейся в памяти, а значит потребляющей пространство, потенциально нужное другим структурам данных. В связи с этим при работе с большими массивами информации всегда лучше считывать только ее нужную часть.
import pandas as pdpd.read_csv('file.csv', usecols=['A', 'B'])
# Считать только столбцы 'A' и 'B'
Более того, можно считывать большие файлы в отдельные фрагменты и маршалировать их в датафреймы.
import pandas as pdfor chunk in pd.read_csv('file.csv', chunksize=1000):
process(chunk)
Таким образом одновременно в памяти удерживается только фрагмент размером chunksize .
5. Применение функций к строкам
Бывают случаи, в которых требуется внести изменения в конкретные столбцы детафрейма. К примеру, в датафрейме X , содержащем столбцы A , B и C , мы можем применить функцию f() к значениям столбца B , чтобы сохранить их в столбце D .
import pandas as pddf['D'] = df.apply(lambda row: f(row['B'], row['C']), axis=1)
Эта операция окажется намного быстрее, чем перебор всего датафрейма с помощью iterrows() .
Есть и альтернативный метод. Его можно использовать, когда функцию f() требуется применить только к одному столбцу.
import pandas as pddf['D'] = df['B'].map(lambda b: f(b))
6. Объединение двух датафреймов
По аналогии с реляционными базами данных датафреймы можно объединять merge , используя разрешающий столбец.
import pandas as pdpd.merge(left=df_a, left_on['A'], right=df_b, right_on=['B'], how='inner')
# Также работает для left и right объединения.
Однако стоит заметить, что операция merge является дорогостоящей, в связи с чем перед слиянием больших датасетов стоит проявлять особое внимание. В случаях, когда датасеты слишком велики, рекомендуется использовать методы группировки (англ.), чтобы избежать перегрузки памяти и связанных с этим проблем производительности.
7. Переименование столбцов
Переименовывать столбцы особенно полезно перед сериализацией файла или перед внедрением стороннего хранилища данных.
import pandas
df = df.rename(columns= "A_1": "A"
"B_1": "B"
>)
# переименовывает оригинальные столбцы ["A_1", "B_1"] в ["A", "B"].
- Новая библиотека превосходит Pandas по производительности
- 7 трюков pandas для науки о данных
- Хватит использовать Pandas, пора переходить на Spark + Scala!
Как перебрать первые 10 строк в DataFrame и увеличить значение в них на 1?
«Можно ли в Pandas менять значение полей в цикле?» — можно. Но в вопросе, который стоит а заголовке — это не надо.
Мне лень набивать большой ДатаФрейм, поэтому вот вам сокращенный пример. В датафрейме 10 строк, меняем первый столбец в первых пяти строках.
print (df) df.A.loc[:4]=df.A.loc[:4]+1 print (df)
Датафрейм до манипуляции:
. A B 0 1 2 1 2 4 2 3 6 3 4 8 4 5 0 5 1 2 6 2 4 7 3 6 8 4 8 9 5 0
Датафрейм после манипуляции:
. A B 0 2 2 1 3 4 2 4 6 3 5 8 4 6 0 5 1 2 6 2 4 7 3 6 8 4 8 9 5 0
Подстроить под свои данные надеюсь сможете сами.
Python: как выбрать строки из Pandas DataFrame
Свойства Pandas DataFrame, такие как iloc и loc, полезны для выбора строк из DataFrame. Есть несколько способов выбора и индексации строк DataFrame. Мы также можем выбирать строки из pandas DataFrame на основе указанных условий. Логические выборки и логические серии также могут быть переданы в общий индексатор [] фрейма данных pandas, и он даст те же результаты.
Как выбрать строки из фрейма данных Pandas
Pandas DataFrame — это двумерная помеченная структура данных со столбцами потенциально разных типов. Вы можете думать об этом как о электронной таблице или таблице SQL, или как о наборе объектов Series. Обычно это наиболее часто используемый объект pandas. Как и Series, DataFrame принимает множество различных типов ввода:
- Dict из 1D ndarrays, списков, dicts или Series
- 2-D numpy. ndarray
- Структурированный или записанный ndarray
- Серия
- Другой фрейм данных
Шаги по выбору строк из Pandas DataFrame
Шаг 1. Настройка данных
Pandas read_csv ( ) — это встроенная функция, которая используется для импорта данных из файла CSV и анализа этих данных в Python. Итак, мы импортируем набор данных из файла CSV, и он будет автоматически преобразован в Pandas DataFrame, а затем выберем данные из DataFrame.
Набор данных для нашего проекта здесь: people.csv

В приведенном выше наборе данных 18 строк и 5 столбцов.
Шаг 2: Импорт данных CSV
Теперь поместите файл в папку нашего проекта и в тот же каталог, что и наш программный файл python app.py.
Напишите следующий код внутри файла app.py .
# app.pyimport pandas как pddf = pd.read_csv ('people.csv') print (df)
Вывод
python3 app.py Имя Пол Возраст Рост Вес 0 Alex M 41 74 1701 Bert M 42 68 1662 Carl M 32 70 1553 Dave M 39 72 1674 Elly F 30 66 1245 Fran F 33 66 1156 Gwen F 26 64 1217 Hank M 30 71 1588 Ivan M 53 72 1759 Джейк М 32 69 14310 Ка te F 47 69 13911 Люк M 34 72 16312 Myra F 23 62 9813 Neil M 36 75 16014 Omar M 38 70 14515 Page F 31 67 13516 Quin M 29 71 17617 Ruth F 28 65 131
Итак, наш DataFrame готов. Функция read_csv () автоматически преобразует данные CSV в DataFrame по завершении импорта.
Мы можем проверить тип данных с помощью функции Python type () .
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') print (type (df))
Вывод
python3 app.py
Шаг 3. Выберите строки из Pandas DataFrame
Выберите строки pandas с помощью свойства iloc
Индексатор iloc Pandas для Pandas Dataframe используется для индексации/выбора на основе целого местоположения по положению. Pandas.DataFrame.iloc — это уникальный встроенный метод, который возвращает индексирование на основе целочисленного местоположения для выбора по положению.
Синтаксис индексатора iloc следующий.
df.iloc [, ]
Это наверняка будет источником путаницы для пользователей R. « iloc» в пандах используется для выбора строк и столбцов по номеру в том порядке, в котором они появляются в DataFrame.
Это означает, что если мы передадим df.iloc [6, 0], это будет означать 6-ю строку индекса (индекс строки начинается с 0) и 0-й столбец, которым является Имя.
Итак, вывод будет согласно нашему DataFrame — это Гвен. Давайте напечатаем это программно.
См. Следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') print (df.iloc [6, 0])
Вывод
python3 app.pyGwen
Вы можете представить, что каждая строка имеет номер строки от 0 до общего числа строк (data.shape [0]), а iloc [] позволяет выбор на основе этих чисел. То же самое относится ко всем столбцам (от 0 до data.shape [1]).
В приведенном выше примере мы выбрали конкретное значение DataFrame, но мы также можем выбрать строки в DataFrame, используя iloc тоже. См. Следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') print (df.iloc [4])
python3 app.pyName EllySex FAge 30Height 66Weight 124Name: 4, dtype: object
Итак, мы выбрали один row, используя свойство iloc [] DataFrame.
Если мы передадим отрицательное значение свойству iloc [], оно даст нам последнюю строку DataFrame.
# app.pyимпорт панд как pddf = pd.read_csv ('people.csv') print (df.iloc [-1])
Вывод
python3 app.pyName RuthSex FAge 28Height 65Weight 131Name: 17, dtype: object
Выбрать строки панд с помощью свойства loc
Свойство Pandas DataFrame loc обеспечивает доступ к группе строк и столбцов по меткам или логическому массиву.
DataFrame.loc [] в основном основан на метках, но также может использоваться с логическим массивом.
Допустимые входные данные:
- Одна метка, например, 5 или ‘a’ (обратите внимание, что 5 интерпретируется как метка индекса, а не как целочисленная позиция вместе с индексом).
- Список или массив меток, например [‘A’, ‘b’, ‘c’].
- Объект среза с ярлыками, например ‘A’: ’f’.
- Логический массив той же длины, что и разрезанная ось, например [True, False, True].
- Вызываемая функция с одним аргументом (вызывающая серия или DataFrame), возвращающая допустимый результат для индексации (один из вышеперечисленных).
Теперь , в нашем примере мы еще не установили индекс. Мы можем использовать функцию Pandas set_index () для установки индекса. Мы устанавливаем столбец Name в качестве нашего индекса.
См. Следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') df.set_index ("Name", inplace = True)
Теперь мы можем выбрать любую метку из Name столбец в DataFrame, чтобы получить строку для конкретной метки.
Допустим, нам нужно выбрать строку с меткой
См. следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') df.set_index ("Name", inplace = True) print (df. loc ['Gwen'])
Вывод
python3 app.pySex FAge 26Height 64Weight 121 Имя: Gwen, dtype: object
Выбрать несколько строк DataFrame в Pandas
Свойство Pandas DataFrame loc [] используется для выбора нескольких строк DataFrame.
Давайте придерживаться приведенного выше примера и добавим еще одну метку с именем Page и выберем несколько строк.
Итак, мы выбираем r методы, основанные на ярлыках Gwen и Page .
Для выбора нескольких строк мы должны передать список ярлыков в loc [] свойство.
См. следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') df.set_index ( "Name", inplace = True) print (df.loc [['Gwen', 'Page']])
Вывод
python3 app.py Пол Возраст Рост Вес Имя Гвен F 26 64 121 Страница F 31 67 135
Булево/логическое индексирование с использованием .loc
Условный выбор с помощью логических массивов с использованием data.loc [] — это наиболее стандартный подход, который я использую с Pandas DataFrames.
При логическом индексировании или логическом выборе вы передаете массив или серию значений True/False в индексатор .loc, чтобы выбрать строки, в которых ваша серия имеет значения True.
См. следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') print (df.loc [df ['Name'] == 'Bert '])
Вывод
python3 app.py Имя Пол Возраст Рост Вес1 Берт M 42 68 166
В приведенном выше примере оператор df [‘Name’] == ‘Bert’] создает серию Pandas со значением True/False для каждой строки в ‘ df ‘ DataFrame, где есть значения « True» для строк, имя которых равно « Bert» .
Здесь используется логическая серия True/False для выбора строк в фрейме данных pandas — выбираются все строки с именем « Bert» .
Python Pandas: выберите строки на основе условий
Давайте выделим все строки, возраст которых равен или больше 40.
См. следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') print (df.loc [df [' Возраст ']> 40])
Вывод
python3 app.py Имя Пол Возраст Рост Вес0 Alex M 41 74 1701 Bert M 42 68 1668 Иван M 53 72 17510 Kate F 47 69 139
Выберите строки, в которых высота меньше 65, а вес больше 160
См. следующий код.
# app.pyimport pandas as pddf = pd.read_csv ('people.csv') op = df.loc [(df ['Height' ]> 70) & (df ['Weight']> 160)] print (op)
Вывод
приложение python3 .py Имя Пол Возраст Рост Вес0 Alex M 41 74 1703 Dave M 39 72 1678 Ivan M 53 72 17511 Luke M 34 72 16316 Quin M 29 71 176
Заключение
Pandas DataFrame предоставляет множество такие операции, как loc и iloc, которые полезны для выбора строк. В этом руководстве мы рассмотрели различные логические условия для выбора строк, столбцов и конкретных значений DataFrame.
Наконец, руководство Как выбрать строки из Pandas DataFrame окончено.
