簡體   English   中英

Python pandas:來自 get_dummies 的動態連接

[英]Python pandas: dynamic concatenation from get_dummies

具有以下數據框:

import pandas as pd

cars = ["BMV", "Mercedes", "Audi"]
customer = ["Juan", "Pepe", "Luis"]
price = [100, 200, 300]
year = [2022, 2021, 2020]


df_raw = pd.DataFrame(list(zip(cars, customer, price, year)),\
                      columns=["cars", "customer", "price", 'year'])

我需要對分類變量carscustomer進行一次熱編碼,為此我對這兩列使用 get_dummies 方法。

numerical = ["price", "year"]
df_final = pd.concat([df_raw[numerical], pd.get_dummies(df_raw.cars),\
                      pd.get_dummies(df_raw.customer)], axis=1)

有沒有辦法以動態方式生成這些虛擬對象,例如將它們放在一個列表中並使用 for 循環遍歷它們。在這種情況下,它可能看起來很簡單,因為我只有 2 個,但如果我有 30 或 60 個屬性,會我要一個一個去嗎?

pd.get_dummies

pd.get_dummies(df_raw, columns=['cars', 'customer'])

   price  year  cars_Audi  cars_BMV  cars_Mercedes  customer_Juan  customer_Luis  customer_Pepe
0    100  2022          0         1              0              1              0              0
1    200  2021          0         0              1              0              0              1
2    300  2020          1         0              0              0              1              0

一種簡單的方法是連接列並使用str.get_dummies

cols = ['cars', 'customer']
out = df_raw.join(df_raw[cols].agg('|'.join, axis=1).str.get_dummies())

輸出:

       cars customer  price  year  Audi  BMV  Juan  Luis  Mercedes  Pepe
0       BMV     Juan    100  2022     0    1     1     0         0     0
1  Mercedes     Pepe    200  2021     0    0     0     0         1     1
2      Audi     Luis    300  2020     1    0     0     1         0     0

另一種選擇是melt並使用crosstab

df2 = df_raw[cols].reset_index().melt('index')
out = df_raw.join(pd.crosstab(df2['index'], df2['value']))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM