
pd.get_dummies 是 pandas 库中一个非常实用的函数,用于将分类变量转换为独热编码(one-hot encoding)。独热编码是一种将分类特征转换为数值形式的技术,使得机器学习算法能够更好地理解和处理这些特征。例如,一个包含“红”、“绿”、“蓝”的列,经过独热编码后会变成三列,每列对应一个颜色,并用0或1表示该样本是否具有该颜色。
然而,许多用户在使用 pd.get_dummies 时会发现,其输出结果是 True 和 False 布尔值,而不是预期的 0 和 1 整数。这是因为 pd.get_dummies 的 dtype 参数默认设置为 bool 类型。虽然布尔值在逻辑上等同于0和1(False 视为0,True 视为1),但在某些场景下,尤其是与某些机器学习库或特定数据处理流程集成时,明确的整数类型 0 和 1 更受欢迎,也更符合直观认知。
以下是一个展示默认行为的示例:
import pandas as pd
# 创建一个示例DataFrame
data = {'Category': ['A', 'B', 'A', 'C', 'B'],
'Value': [10, 20, 15, 25, 30]}
df = pd.DataFrame(data)
print("原始DataFrame:")
print(df)
# 使用默认设置进行独热编码
df_dummies_default = pd.get_dummies(df['Category'])
print("\n默认get_dummies输出 (布尔值):")
print(df_dummies_default)
print(f"输出数据类型: {df_dummies_default.dtypes.iloc[0]}")输出结果:
原始DataFrame:
Category Value
0 A 10
1 B 20
2 A 15
3 C 25
4 B 30
默认get_dummies输出 (布尔值):
A B C
0 True False False
1 False True False
2 True False False
3 False False True
4 False True False
输出数据类型: bool从输出中可以看到,新生成的列 A、B、C 的值都是 True 或 False,并且数据类型为 bool。
要解决 pd.get_dummies 返回布尔值而非0和1整数的问题,最直接且推荐的方法是使用 dtype 参数。通过将 dtype 参数设置为 int (或 int8, uint8 等整数类型),可以强制 pd.get_dummies 输出 0 和 1 的整数值。
下面是修改后的代码示例:
import pandas as pd
import numpy as np # 导入numpy以使用其数据类型
# 创建一个示例DataFrame
data = {'Category': ['A', 'B', 'A', 'C', 'B'],
'Value': [10, 20, 15, 25, 30]}
df = pd.DataFrame(data)
# 使用dtype=int进行独热编码
df_dummies_int = pd.get_dummies(df['Category'], dtype=int)
print("\n使用dtype=int后的get_dummies输出 (整数0和1):")
print(df_dummies_int)
print(f"输出数据类型: {df_dummies_int.dtypes.iloc[0]}")
# 也可以直接对整个DataFrame进行编码
df_encoded_full = pd.get_dummies(df, columns=['Category'], dtype=int)
print("\n对整个DataFrame指定列进行编码并输出整数0和1:")
print(df_encoded_full)
print(f"输出数据类型: {df_encoded_full['Category_A'].dtype}")输出结果:
使用dtype=int后的get_dummies输出 (整数0和1): A B C 0 1 0 0 1 0 1 0 2 1 0 0 3 0 0 1 4 0 1 0 输出数据类型: int64 对整个DataFrame指定列进行编码并输出整数0和1: Value Category_A Category_B Category_C 0 10 1 0 0 1 20 0 1 0 2 15 1 0 0 3 25 0 0 1 4 30 0 1 0 输出数据类型: int64
通过将 dtype 设置为 int,我们成功地将独热编码的输出从布尔值转换为了 0 和 1 的整数。这里的 int 通常会映射到 int64 (取决于系统架构),但你也可以指定更具体的整数类型,例如 np.int8 或 np.uint8。
在进行数据预处理时,了解并正确使用 pd.get_dummies 的 dtype 参数至关重要。以下是一些相关的实际应用和注意事项:
内存优化: 当处理具有大量类别或大规模数据集时,生成的独热编码列可能会非常多。使用 int64 可能会占用较多内存。如果确定只需要 0 和 1 两种状态,可以考虑使用占用内存更小的整数类型,例如 np.int8 (8位有符号整数) 或 np.uint8 (8位无符号整数)。
import numpy as np
df_dummies_uint8 = pd.get_dummies(df['Category'], dtype=np.uint8)
print("\n使用dtype=np.uint8后的get_dummies输出:")
print(df_dummies_uint8)
print(f"输出数据类型: {df_dummies_uint8.dtypes.iloc[0]}")这将有效地减少内存占用,尤其是在独热编码列非常多的情况下。
处理缺失值: pd.get_dummies 默认会忽略缺失值(NaN)。如果需要将缺失值也视为一个独立的类别进行编码,可以使用 dummy_na=True 参数。
data_with_nan = {'Category': ['A', 'B', 'A', np.nan, 'B']}
df_nan = pd.DataFrame(data_with_nan)
df_dummies_nan = pd.get_dummies(df_nan['Category'], dtype=int, dummy_na=True)
print("\n处理缺失值并输出整数0和1:")
print(df_dummies_nan)这将额外生成一个 Category_nan 列来表示缺失值。
对特定列进行编码: 如果 DataFrame 中有多个列,而你只想对其中一部分分类列进行独热编码,可以使用 columns 参数。
df_full = pd.DataFrame({'Color': ['Red', 'Green', 'Blue'],
'Size': ['S', 'M', 'L'],
'Price': [10, 20, 30]})
df_encoded_specific = pd.get_dummies(df_full, columns=['Color', 'Size'], dtype=int)
print("\n对特定列进行编码并输出整数0和1:")
print(df_encoded_specific)这样只会对 Color 和 Size 列进行编码,而 Price 列保持不变。
与机器学习模型的兼容性: 大多数机器学习模型(如Scikit-learn中的模型)期望输入数据是数值类型。虽然它们通常可以隐式地将布尔值视为0和1,但明确地提供 0 和 1 的整数类型可以避免潜在的兼容性问题,并使代码更具可读性和健壮性。
pd.get_dummies 是 Pandas 中用于独热编码的强大工具。其默认行为是返回布尔值(True/False),但通过简单地设置 dtype=int(或 dtype=np.uint8 等)参数,可以轻松地将其输出更改为 0 和 1 的整数值。理解并正确应用 dtype 参数不仅能确保数据格式符合预期,还能在处理大规模数据时优化内存使用,并提高与下游机器学习流程的兼容性。在进行数据预处理时,养成明确指定 dtype 的习惯,将有助于构建更稳定和高效的数据管道。
以上就是Pandas get_dummies:确保独热编码输出为0和1的整数值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号