python - 如何使用pandas基于两个分类列的组合进行单热编码?

标签 python pandas dataframe

我正在尝试用 Pandas 做一些单热编码。输入数据如下所示:

import pandas as pd

# input data
df = pd.DataFrame({
    "pid"  : [1, 1, 2, 3],
    "code" : ["a", "b", "b", "c"],
    "time" : [0, 0, 1, 0]
})

# two of the columns are categories
df["code"] = df.code.astype("category")
df["time"] = df.time.astype("category")
我想对列的组合进行单热编码 codetime以生成与每列中类别的所有组合相对应的 6 列的方式。在这个小例子中,这将是 a_0、a_1、b_0、b_1、c_0 和 c_1。
# i've tried doing this:
df["code_time"] = df.code.astype("str") + df.time.astype("str")
del df["code"]
del df["time"]
pd.get_dummies(df, columns=["code_time"])
但这不会给我 a_1 和 c_1 组合,因为它们没有出现在数据中。是否有任何直接的方法来产生我想要的输出:
df_out = pd.DataFrame({
    "pid"  : [1, 2, 3]
    "a_0"  : [1, 0, 0]
    "a_1"  : [0, 0, 0]
    "b_0"  : [1, 0, 0]
    "b_1"  : [0, 1, 0]
    "c_0"  : [0, 0, 1]
    "c_1"  : [0, 0, 0]
})

最佳答案

一个简单的解决方案是创建完整的产品:

from itertools import product
code_times = [f'{x}_{y}' for x,y in product(df['code'].unique(), df['time'].unique())]

data = df.code.astype("str") + '_'+ df.time.astype("str")

# use crosstab for get_dummies() + sum by id
pd.crosstab(df['pid'], data).reindex(code_times, fill_value=0, axis=1)
输出:
col_0  a_0  a_1  b_0  b_1  c_0  c_1
pid                                
1        1    0    1    0    0    0
2        0    0    0    1    0    0
3        0    0    0    0    1    0

关于python - 如何使用pandas基于两个分类列的组合进行单热编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66122583/

相关文章:

python - 将一个级别(具有固定值)附加到 pandas Series/DataFrame

python - 使用 tempfile 在 Flask 中创建 pdf/xls 文档

python - 使用 python 处理 pdf 中的表

python - Sphinx with Django - 模型未声明显式应用程序标签

python - 正则表达式为什么 `findall` 什么也找不到,但 `search` 有效?

python - 与儒略日的 Pandas 日期时间

python - pandas 与 numpy 的不同标准

python - 如何从数据框 Pandas 制作列表列表?

Python .loc 困惑

python - 如何在整个数据框中搜索特定值并返回其列索引和行索引