pandas@get_dummies@ 虚拟变量@one-hot encoding
虚拟变量@one-hot encoding
-
pandas.get_dummies — pandas 1.5.3 documentation (pydata.org)
-
将分类变量转换为虚拟/指示变量。
- 在数据分析领域,dummies通常被翻译为“虚拟变量”、“指示变量”或“哑变量”,这些术语都是比较通用的翻译。其中,虚拟变量(dummies) 是最接近原始英文含义的翻译,而指示变量和哑变量则更加抽象。因此,通常建议使用“虚拟变量”,它能够比较直观地表达出数据转换的含义
-
在数据分析中,有时需要将分类变量转换为虚拟变量或指示变量。该过程可以将具有一组可能值的单个分类变量转换为多个二元变量,每个变量代表一个可能的值。
-
例如,假设您有一个名为“颜色”的分类变量,其可能的值是“红色”、“蓝色”和“绿色”。通过将此变量转换为三个虚拟变量,“红色”对应的变量将设置为1,而其他两个变量将设置为0,以及其他两种可能的值。
-
这种转换可以使得机器学习模型可以更好地理解和利用分类变量的信息,因为它们不再被视为单个离散值。
-
Converting a categorical variable into dummy/indicator variables is a common technique used in data preparation and analysis. It involves creating one or more binary (0 or 1) variables to represent each category of the original variable.
Here’s an example of how to do this in Python using pandas:
import pandas as pd # create a sample dataframe with a categorical variable df = pd.DataFrame({'fruit': ['apple', 'banana', 'orange', 'apple', 'orange']}) # use get_dummies() to create dummy variables dummy_df = pd.get_dummies(df['fruit'], prefix='fruit') # concatenate the dummy variables with the original dataframe df = pd.concat([df, dummy_df], axis=1) # drop the original categorical variable df.drop('fruit', axis=1, inplace=True) print(df) Output:
fruit_apple fruit_banana fruit_orange 0 1 0 0 1 0 1 0 2 0 0 1 3 1 0 0 4 0 0 1 In this example, the
get_dummies()
function creates three dummy variables (fruit_apple
,fruit_banana
, andfruit_orange
) based on the three unique categories in the originalfruit
column. Theprefix
argument adds a prefix to the column names for easier identification. The resulting dummy variables are then concatenated with the original dataframe usingpd.concat()
, and the original categorical variable is dropped using thedrop()
method.
demo
demo1
-
Converting a categorical variable into dummy/indicator variables is a common data preparation step in machine learning and statistical analysis. This process involves creating new binary variables, one for each possible category in the original variable. These binary variables take a value of 1 if the observation belongs to that category and 0 otherwise.
-
Here’s an example of how to convert a categorical variable “Color” into dummy/indicator variables:
Original dataset:
ID Color 1 Red 2 Green 3 Blue 4 Yellow 5 Red After converting “Color” into dummy variables, the dataset would look like this:
ID Color_Red Color_Green Color_Blue Color_Yellow 1 1 0 0 0 2 0 1 0 0 3 0 0 1 0 4 0 0 0 1 5 1 0 0 0
demo2
-
import pandas as pd df = pd.DataFrame({'color': ['red', 'blue', 'green', 'red']}) dummies = pd.get_dummies(df['color'], prefix='color') print(dummies) -
color_blue color_green color_red 0 0 0 1 1 1 0 0 2 0 1 0 3 0 0 1
-
-
df_with_dummies = pd.concat([df, dummies], axis=1) print(df_with_dummies) -
color color_blue color_green color_red 0 red 0 0 1 1 blue 1 0 0 2 green 0 1 0 3 red 0 0 1
-
-
这里我们首先创建了一个包含分类变量“color”的DataFrame,然后使用get_dummies()函数将其转换为虚拟变量,并设置了前缀为“color”。最后,我们将原始DataFrame与虚拟变量合并起来形成新的DataFrame,即
df_with_dummies
。
demo3
-
import os #指向父目录的一个名为data的目录 data_dir = os.path.join('..', 'data') # 将自定目录创建(指定exist_ok=True,如果要创建的目录已经存在,则跳过) os.makedirs(data_dir, exist_ok=True) import pandas as pd data_file = os.path.join('..', 'data', 'house_tiny.csv') with open(data_file, 'w') as f: f.write('NumRooms,Alley,Price\n') # 列名 f.write('NA,Pave,127500\n') # 每行表示一个数据样本 f.write('2,NA,106000\n') f.write('4,NA,178100\n') f.write('NA,NA,140000\n') data = pd.read_csv(data_file) print(data) -
本例中,对于
inputs
中的类别值或离散值,我们将“NaN”视为一个类别。 -
NumRooms Alley Price 0 NaN Pave 127500 1 2.0 NaN 106000 2 4.0 NaN 178100 3 NaN NaN 140000 -
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2] print(f'{data=}\n{inputs=}\n{outputs=}') -
data= NumRooms Alley Price 0 NaN Pave 127500 1 2.0 NaN 106000 2 4.0 NaN 178100 3 NaN NaN 140000 inputs= NumRooms Alley 0 NaN Pave 1 2.0 NaN 2 4.0 NaN 3 NaN NaN outputs= 0 127500 1 106000 2 178100 3 140000 Name: Price, dtype: int64
-
数值化
-
由于“巷子类型”(“Alley”)列只接受两种类型的类别值“Pave”和“NaN”,
pandas
可以自动将此列转换为两列“Alley_Pave”和“Alley_nan”。- 巷子类型为“Pave”的行会将“Alley_Pave”的值设置为1,“Alley_nan”的值设置为0。
- 缺少巷子类型的行会将“Alley_Pave”和“Alley_nan”分别设置为0和1。
-
pd.get_dummies(inputs, dummy_na=True) -
NumRooms Alley_Pave Alley_nan 0 NaN 1 0 1 2.0 0 1 2 4.0 0 1 3 NaN 0 1 -
这就将Alley(包括字符型和NaN)变为Alley_Pave和Alley_nan两个都是数值类型的字段
-
插值处理NaN数值化
-
mean=inputs.mean(numeric_only=True) inputs = inputs.fillna(mean) print(inputs) -
NumRooms Alley_Pave Alley_nan 0 3.0 1 0 1 2.0 0 1 2 4.0 0 1 3 3.0 0 1
-
-
inputs = pd.get_dummies(inputs, dummy_na=True) print(inputs) - [现在
inputs
中的所有条目都是数值类型,它们可以转换为张量格式。]
- [现在
-
inputs.values -
array([[3., 1., 0.], [2., 0., 1.], [4., 0., 1.], [3., 0., 1.]])
-
其他get_dummies例
-
print(pd.get_dummies(inputs)) -
NumRooms Alley_Pave 0 NaN 1 1 2.0 0 2 4.0 0 3 NaN 0
-
-
pd.get_dummies(inputs["Alley"]) -
Pave 0 1 1 0 2 0 3 0
-
-
pd.get_dummies(inputs["Alley"],dummy_na=True) -
Pave NaN 0 1 0 1 0 1 2 0 1 3 0 1
-
-
pd.get_dummies(data['Price']) -
106000 127500 140000 178100 0 0 1 0 0 1 1 0 0 0 2 0 0 0 1 3 0 0 1 0
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)