Обработка данных Pandas по трем осям — карта, применение, применениеПодробная карта

анализ данных
Обработка данных Pandas по трем осям — карта, применение, применениеПодробная карта

Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте

При ежедневной обработке данных часто бывает необходимоDataFrameВыполнять построчные, столбцовые и поэлементные операции, соответствующие этим операциям, в Pandasmap,applyиapplymapОн может решить большинство этих потребностей в обработке данных. Эта статья начинается скейсслучайныйдиаграммаметод, мы представим три метода в деталях.Принцип реализации, я считаю, что после прочтения этой статьи как Xiaobai, так и опытные пользователи Pandas получат более глубокое представление об этих трех методах.

Набор данных, показанный в этой статье, создан путем моделирования. Если вы хотите попрактиковаться, вы можете создать его, нажав код ниже.

boolean=[True,False]
gender=["男","女"]
color=["white","black","yellow"]
data=pd.DataFrame({
    "height":np.random.randint(150,190,100),
    "weight":np.random.randint(40,90,100),
    "smoker":[boolean[x] for x in np.random.randint(0,2,100)],
    "gender":[gender[x] for x in np.random.randint(0,2,100)],
    "age":np.random.randint(15,90,100),
    "color":[color[x] for x in np.random.randint(0,len(color),100) ]
}
)

Набор данных показан ниже со столбцами, представляющими рост, вес, курение, пол, возраст и цвет кожи.

数据集.png

Обработка серийных данных

использование карты

Если вам нужно централизовать данныеgenderМужской столбец заменяется на 1, а женский на 0. Как это сделать? Определенно не реализовано с циклом for, используйтеSeries.map()Это можно сделать очень легко, по крайней мере, с одной строкой кода.

#①使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})

#②使用函数
def gender_map(x):
    gender = 1 if x == "男" else 0
    return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)

ТотmapКак это работает на практике? Пожалуйста, смотрите диаграмму ниже (для удобства представления перехватываются только первые 10 фрагментов данных)

字典map原理.png

函数map原理.png

Используете ли вы словарь или функцию для отображения,mapМетод заключается в том, чтобы поместить соответствующие данныеодин за другим в качестве параметровПередайте его в словарь или функцию, чтобы получить сопоставленное значение.

apply

В то же время объект Series также имеетapplyметод,applyкак работает метод иmapМетод аналогичен, разница в том, чтоapplyВозможность передачи более сложных функций. Как понять это? Взгляните на примеры ниже.

Предполагая, что в процессе данных статистики возрастageСтолбец имеет большую ошибку и нуждается в корректировке (плюс-минус значение) из-за этого плюс-минуснеизвестный, поэтому при определении функции нужно добавить еще один параметрbias, затем используйтеmapметод неработоспособен (переход вmapфункция может принимать только один параметр),applyспособ может решить эту проблему.

def apply_age(x,bias):
    return x+bias

#以元组的方式传入额外的参数
data["age"] = data["age"].apply(apply_age,args=(-3,))

数据1.png

Видно, что столбец age уменьшился на 3. Конечно, это всего лишь простой пример, когда требуется сложная обработка, он может лучше отразитьapplyэффект.

В целом, для Серии,mapОн может решить большинство потребностей в обработке данных, но если вам нужно использовать более сложные функции, вам нужно использоватьapplyметод.

Обработка данных DataFrame

apply

правильноDataFrameС точки зрения,applyЭто очень важный метод обработки данных. Он может принимать различные функции (встроенные или пользовательские в Python), и метод обработки очень гибкий. Давайте рассмотрим несколько примеров ниже.applyКонкретное использование и принцип .

Прежде чем углубляться в детали, нам нужно сначала представитьDataFrameсерединаaxisконцепция, вDataFrameВ большинстве методов объекта будетaxisЭтот параметр определяет, выполняется ли указанная вами операция по оси 0 или по оси 1.axis=0представляет пару действий列columnsпровести,axis=1представляет пару действий行rowдействовать, как показано на рисунке ниже.

dataframe的axis介绍.png

Если вы мало что знаете об этом, ничего страшного, мы поговорим об этом отдельно ниже.applyОбъясните операцию по оси 0 и оси 1 и продолжайте движение вниз.

Допустим, теперь необходимоdataЧисловые столбцы влогарифмироватьисуммаоперация, вы можете использоватьapplyВыполните соответствующую операцию, потому что она должна работать со столбцом, поэтому вам нужно указатьaxis=0, наша проблема может быть легко решена с помощью следующих двух строк кода.

# 沿着0轴求和
data[["height","weight","age"]].apply(np.sum, axis=0)

# 沿着0轴取对数
data[["height","weight","age"]].apply(np.log, axis=0)

Способ его реализации прост, но вызовapplyЧто именно произошло? Как осуществляется процесс? Или выяснить в качестве иллюстрации. (Возьмите первые пять частей данных в качестве примера)

dataframe按列apply_1.png

dataframe按列apply_2.png

когда вместе轴0(axis=0)При работе каждый столбец (columns) по умолчаниюSeriesФорма передается в качестве параметра в указанную вами функцию операции, операция объединяется и возвращается соответствующий результат.

Затем, если вам нужно работать по строке в реальном использовании (axis=1), Как достигается весь процесс?

В наборе данных есть данные роста и веса, поэтому по этому мы можем рассчитать индекс ИМТ каждого человека (показатель, обычно используемый при медицинских осмотрах, важный стандарт измерения степени ожирения и здоровья организма человека) , формула расчета:体重指数BMI=体重/身高的平方(国际单位kg/㎡), так как операцию нужно выполнять над каждым образцом, здесь мы используемaxis=1изapplyДля работы код такой:

def BMI(series):
    weight = series["weight"]
    height = series["height"]/100
    BMI = weight/height**2
    return BMI

data["BMI"] = data.apply(BMI,axis=1)

Давайте воспользуемся графическим способом, чтобы увидеть, как этот процесс реализован (в качестве примера взяты первые 5 фрагментов данных).

dataframe按列apply_3.png

когдаapplyуже настроенaxis=1При работе со строками каждая строка данных будетSeriesФорма (индекс Серии — это имя столбца) передается указанной функции и возвращается соответствующий результат.

суммировать доDataFrameизapplyработать:

  1. когдаaxis=0когда, да每列columnsвыполнить указанную функцию; когдаaxis=1когда, да每行rowВыполнить указанную функцию.
  2. несмотря ни на чтоaxis=0все ещеaxis=1, форма по умолчанию, переданная в указанную функцию,Series, можно установитьraw=Trueвходящийnumpy数组.
  3. После выполнения результатов для каждой серии результат интегрируется вместе (если вы хотите вернуть, вам нужно определить функциюreturnсоответствующее значение)
  4. Конечно,DataFrameизapplyиSeriesизapplyТаким же образом он может получать и более сложные функции, такие как входящие параметры и т. д. Принцип реализации тот же, за подробностями обращайтесь к официальной документации.

applymap

applymapИспользование относительно простое, будетDataFrameКаждая ячейка в выполняет действие указанной функции, хотя и менее полезной.applyОбширный, но полезный в некоторых ситуациях, как в примере ниже.

Для удобства демонстрации вновь сгенерированныйDataFrame

df = pd.DataFrame(
    {
        "A":np.random.randn(5),
        "B":np.random.randn(5),
        "C":np.random.randn(5),
        "D":np.random.randn(5),
        "E":np.random.randn(5),
    }
)
df

数据2.png

теперь хочуDataFrameВсе значения отображаются с двумя десятичными знаками, используйтеapplymapВы можете быстро добиться желаемого, код и схема следующие:

df.applymap(lambda x:"%.2f" % x)

applymap.png

Здесь представлены три оси обработки данных.Если у вас есть какие-либо вопросы, оставьте сообщение ниже!

Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерейные товары в первый раз, и вы также можете присоединиться к группе обмена обучением Python! !

底部二维码.png