gpt4 book ai didi

python - 按组和虚拟代码分类变量转换长格式分类数据

转载 作者:行者123 更新时间:2023-12-05 04:42:28 25 4
gpt4 key购买 nike

对于以下数据框,我试图将分类变量 ('purchase_item') 转换为宽格式并将它们虚拟编码为 1/0 - 基于客户是否在 2016 年的 4 个季度中的每个季度购买了它.

enter image description here

我想生成一个旋转数据框,如下所示: enter image description here

为了获得上面显示的预期结果,我基本上尝试了各种方法来将 groupby/pivot_table 函数与对 pandas 中的 get_dummies() 函数的调用结合起来。例子:data.groupby(["cust_id", "purchase_qtr"])["purchase_item"].reset_index().get_dummies()

但是,到目前为止,我的尝试都没有奏效。

有人可以帮我生成想要的结果吗?

最佳答案

这样做的一种方法是获取交叉制表,然后强制所有 > 1 的值变为 1,同时保持所有 0 不变:

长话短说

out = (
pd.crosstab([df["cust_id"], df["purchase_qtr"]], df["purchase_item"])
.gt(0)
.astype(int)
.reset_index()
)

分解一切:

创建数据

df = pd.DataFrame({
"group1": np.repeat(["a", "b", "c"], 4),
"group2": [1, 2, 3] * 4,
"item": np.random.choice(["ab", "cd", "ef", "gh", "zx"], size=12)
})

print(df)
group1 group2 item
0 a 1 cd
1 a 2 ef
2 a 3 gh
3 a 1 ef
4 b 2 zx
5 b 3 ab
6 b 1 ab
7 b 2 gh
8 c 3 gh
9 c 1 cd
10 c 2 ef
11 c 3 gh

交叉制表

这将返回一个频率表,指示每个类别一起观察的频率:

crosstab = pd.crosstab([df["group1"], df["group2"]], df["item"])

print(crosstab)
item ab cd ef gh zx
group1 group2
a 1 0 1 1 0 0
2 0 0 1 0 0
3 0 0 0 1 0
b 1 1 0 0 0 0
2 0 0 0 1 1
3 1 0 0 0 0
c 1 0 1 0 0 0
2 0 0 1 0 0
3 0 0 0 2 0

强制计数为虚拟代码

因为我们想要虚拟代码,而不是计算类别的共现,我们可以使用一个快速的技巧来强制所有大于 0 的值 gt(0) 变成 1 astype(int)

item           ab  cd  ef  gh  zx
group1 group2
a 1 0 1 1 0 0
2 0 0 1 0 0
3 0 0 0 1 0
b 1 1 0 0 0 0
2 0 0 0 1 1
3 1 0 0 0 0
c 1 0 1 0 0 0
2 0 0 1 0 0
3 0 0 0 1 0

关于python - 按组和虚拟代码分类变量转换长格式分类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69846753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com