我正在尝试用 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")
我想对列的组合进行单热编码 code
和 time
以生成与每列中类别的所有组合相对应的 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/