pandas.DataFrame.apply¶
Objects passed to the function are Series objects whose index is either the DataFrame’s index ( axis=0 ) or the DataFrame’s columns ( axis=1 ). By default ( result_type=None ), the final return type is inferred from the return type of the applied function. Otherwise, it depends on the result_type argument.
Parameters func function
Function to apply to each column or row.
Axis along which the function is applied:
0 or ‘index’: apply function to each column.
1 or ‘columns’: apply function to each row.
Determines if row or column is passed as a Series or ndarray object:
False : passes each row or column as a Series to the function.
True : the passed function will receive ndarray objects instead. If you are just applying a NumPy reduction function this will achieve much better performance.
These only act when axis=1 (columns):
‘expand’ : list-like results will be turned into columns.
‘reduce’ : returns a Series if possible rather than expanding list-like results. This is the opposite of ‘expand’.
‘broadcast’ : results will be broadcast to the original shape of the DataFrame, the original index and columns will be retained.
The default behaviour (None) depends on the return value of the applied function: list-like results will be returned as a Series of those. However if the apply function returns a Series these are expanded to columns.
args tuple
Positional arguments to pass to func in addition to the array/series.
**kwargs
Additional keyword arguments to pass as keywords arguments to func .
Returns Series or DataFrame
Result of applying func along the given axis of the DataFrame.
For elementwise operations.
Only perform aggregating type operations.
Only perform transforming type operations.
Functions that mutate the passed object can produce unexpected behavior or errors and are not supported. See Mutating with User Defined Function (UDF) methods for more details.
Using a numpy universal function (in this case the same as np.sqrt(df) ):
Using a reducing function on either axis
Returning a list-like will result in a Series
Passing result_type=’expand’ will expand list-like results to columns of a Dataframe
Returning a Series inside the function is similar to passing result_type=’expand’ . The resulting column names will be the Series index.
Passing result_type=’broadcast’ will ensure the same shape result, whether list-like or scalar is returned by the function, and broadcast it along the axis. The resulting column names will be the originals.
Как применить функцию к каждой строке одного столбца в кадре данных pandas?

Я переименовал имя последнего столбца из «Name» в «ticks» и создал новый пустой столбец «Name»:
Я написал следующую функцию, чтобы вернуть название компании для данного символа тикера:
Теперь я хочу заполнить столбец «Имя» названием компании с соответствующими символами тикера. Для этого я написал следующую лямбда-функцию:
Но эта последняя строка кода просто продолжает работать. Что-то идет не так? Если да, то как мне это исправить?
Я попробовал то же самое с map вместо apply , но результат тот же.
3 ответа
Вы можете использовать pandas.apply() , чтобы применить функцию к каждой строке / столбцу в Dataframe.
Вы также можете использовать лямбда-функцию для каждого столбца. Например:
modDfObj = dfObj.apply(lambda x : x + 10)
Другой пример (здесь эта функция применяется только к столбцу z ):
modDfObj = dfObj.apply(lambda x: np.square(x) if x.name == ‘z’ else x)
Во-первых, вам не нужны lambda или apply .
Лучше. Во-вторых, как отмечают другие, это гротескно неэффективно. Вы делаете звонок 600000 раз, хотя количество тикеров у вас намного меньше. Будет работать следующий подход кувалдой:
Затем сопоставьте my_return с вашим тикером.
Глядя на источник из yfinance, вы можете увидеть здесь что метод get_info вызывает <который, в свою очередь, выполняет довольно несколько вызовов API для разных сайтов, чтобы получить необходимую информацию.
Так как это выполняется для каждой строки, вы столкнетесь с некоторыми проблемами, так как сайты могут ограничить вас. Может быть, вы могли бы сделать предварительный шаг, чтобы получить все уникальные имена, а затем найти их один раз и сохранить их в каком-то поиске CSV или тому подобном
Обработка данных с Pandas: разведывательный анализ данных

Прежде чем приступить к практической части анализа данных, предлагаем ознакомиться с вводной статьей о библиотеке Pandas и структурах данных DataFrame и Series.
Получение информации о датафрейме (DataFrame)
Получить детальную информацию о колонках DataFrame можно с помощью метода .info()
Давайте создадим датафрейм и попробуем посмотреть информацию о нем:

Метод .info() дает информацию об:
- общем количестве строк,
- количестве колонок и их названии,
- количестве непустых строк для кажой из колонок (признаков),
- типе данных, хранящихся в колонке.
Метод .info() на объемном DataFrame
Чтобы убедиться в полезности данного метода, попробуйте загрузить готовый датафрейм с большим количеством строк и применить метод .info().
Готовые датафреймы в различных форматах можно скачать, например, с сайта Всемирного Банка.
Получение статистической информации о датафрейме (DataFrame)
Получить статистическую характеристику данных можно с помощью метода .describe()
.describe() позволяет узнать:
- количество непустых значений,
- среднее,
- максимальное и минимальное значение,
- стандартное отклонение,
- медиану,
- 0.25 и 0.75 квартили.
Все эти показатели являются статистически важными. На их основе можно делать аналитику, строить графики, исследовать выбросы значений и многое другое.
Давайте посмотрим статистику по созданному ранее датафрейму:
Итак, .describe() демонстрирует статистическую информацию по всем числовым колонкам.
Статистические методы в Pandas
Для того, чтобы из DataFrame отдельно извлечь статистические параметры в Pandas используются и другие методы:
Количество непустых значений
Квантиль: в скобках указывается параметр: 0.25, 0.5 (то же, что и медиана) или 0.75
Давайте попробуем получить максимальную выручку. Для того, чтобы сделать это, необходимо применить метод .max() к столбцу “выручка”.
Если применить любой из этих статистических методов к конкретной колонке — в результате мы получим число, например, максимальное значение. А если ко всему датафрейму — получим объект типа Series.
Кстати, в каждый из статистических методов можно передать параметр, например, применить метод к строке (axis=0) или столбцу (axis=1) или определить, что делать вычисления нужно только по числовым столбцам или строкам (numeric_only=True).
Вывод колонки DataFrame
Вывести колонку можно двумя способами:
- df['column_name']
- df.column_name
Извлечение значений по условиям в Pandas
Иногда нам нужно получить не все данные из DataFrame, а только некоторые, удовлетворяющие каким-то условиям.
Разберем практический пример. У нас есть база сотрудников с информацией об их именах, возрасте и зарплате. Создадим dataframe:
Давайте выведем только тех сотрудников, чей возраст превышает 30 лет:
Итак, все просто: мы указываем DataFrame, к которому применяем условие, а само условие записывается в квадратных скобках. Подробнее об операторах сравнения.
Если вы хотите потренироваться на более объемных уже готовых датафреймах, можете загрузить любой по ссылке.
В качестве условий можно также использовать статистические методы.
Давайте попробуем вывести имена тех сотрудников, чья зарплата выше среднего:
Извлечение данных из DataFrame по нескольким условиям
Условия можно совмещать, используя оператор “&” (и) или “|” (или).
Например, вывести сотрудников, чей возраст меньше 30, а зарплата выше среднего, можно использовать следующую конструкцию:
Очистка данных с помощью Pandas
Давайте загрузим готовый датафрейм с фильмами.
О том, как открыть csv или excel файлы в Pandas читайте тут.
Во-первых, проверим датасет на наличие пропусков (пустых значений):
На скриншоте видно, что в датасете всего 9742 строки.
В поле “movieId” пропусков нет, а два других столбца содержат пустые значения.
Поскольку в данном случае оба столбца содержат строки (названия фильмов и жанры) мы можем только удалить пустые строки. Сделать это можно с помощью метода “.dropna()”.
Применение метода .dropna() без параметров в результате удалит ВСЕ строки, где были пропуски. Если нужно удалить не строки, а все столбцы, где есть хоть один пропуск в скобках метода .dropna() указывается параметр “axis=1”, где 1 указывает на столбец:
Удаление столбцов DataFrame в Pandas
Наличие нескольких пропусков в столбце обычно не влияет критически на анализ, к тому же эти пропуски можно заполнить, например, средним значением по столбцу.
Бывает такое, что пропусков слишком много или признак (столбец) не несет важной для анализа информации, тогда его целесообразно удалить вовсе. Чтобы это сделать нужно применить метод “.drop()”, где указывается название столбца и параметр “axis=1”, где 1 указывает на столбец. Удалим столбец с id фильмов:
Метод .DataFrame.drop() содержит ряд параметров.
Создание новых признаков в Pandas
Сбор, подготовка и очистка данных — большая часть анализа. В реальных условиях от аналитика данных часто требуется не только привести данных в порядок, но и собрать дополнительную информацию, которая может быть полезной при исследованиях, например, выявлении закономерностей или аномалий.
Приведем практический пример: крупная компания, занимающаяся недвижимостью строит новый жилой комплекс. Для того, чтобы цена за жилье была оправданной, необходимо проанализировать много очевидно важных факторов: стоимость материалов, площадь квартир, вид отделки. Но есть и те факторы, которые влияют косвенно, например, инфраструктура, наличие школ и детских садов. Такие данные часто приходится собирать отдельно.
Представим, что дополнительные данные мы уже собрали, но хранятся они отдельно, да еще и в разных форматах. Существует много метода объединения данных, но сейчас мы поговорим только о том, как добавить новый признак или столбец уже имеющемуся датасету.
Создадим датафрейм с двумя колонками рандомных чисел:
Для того, чтобы создать новую колонку в dataframe, необходимо указать название датафрейма и название новой колонки в квадратных скобках и присвоить ей значение. Создадим новую колонку 'fird_col' с 10 случайными числами и добавим ее к dataframe:
Теперь датасет выглядит так:
Изменение данных в DataFrame в Pandas
Кроме сбора дополнительных данных, как уже упоминалось, значительную часть времени занимает предобработка и очистка или разведывательный анализ данных.
Давайте разберем методы преобразования данных с помощью pandas на практическом примере. Готовый датасет можно скачать по ссылке.
Датасет представляет собой описание того, как условия жизни учеников, например, образование родителей, наличие отношений и интернета, влияют на их оценки по математике.
Мы не будем проводить целое исследование признаков, скорее рассмотрим как обработать данные: например, привести данные в колонке к одному формату или создать новый признак на основе имеющихся.
Обратимся к признаку “romantic”, который содержит текстовые данные: “yes”, если учащийся имеет романтические отношения и “no”, если нет.
Бывают случаи, например, в рамках машинного обучения, когда мы можем работать только с числовыми типами данных. Давайте попробуем преобразовать два возможных значения этой колонки в числа (по сути сделать признак бинарным): “1”, в случае наличия отношения и “0” — в обратном.
Есть два способа изменения значений колонки:
1. мы можем написать функцию. Этот способ оптимален в том случае, если нужно изменить данные в несколько шагов, сделать несколько операций или шагов, или применить сразу к нескольким колонкам;
можем воспользоваться lambda-функцией. С помощью нее можно выполнять простые преобразования данных, не создавая функции. Однако если одну и ту же функцию надо применить к нескольким колонкам, удобнее создать обычную функцию.
Рассмотрим первый вариант:
Применить функцию к конкретной колонке в Pandas позволяет метод .apply():
Обновить колонку датафрейма:
2. Второй вариант: изменение значений колонки с помощью lambda-функции в Pandas
В данном случае мы делаем простое преобразование, значит можно воспользоваться безымянной функцией — lambda. Синтаксис довольно простой:
С помощью функции lambda пройдемся по всем значениям (х) колонки, к которой она применена и вернем “1”, если значение (x) — “yes”, в противном случае вернем 0.
Итак, мы рассмотрели базовые манипуляции с данными при помощи библиотеки Pandas.
В следующих статьях мы рассмотрим, как анализировать данные, делать и проверять гипотезы и строить красивые и понятные графики в рамках Data Science.