基于customerid与state创建交叉表时Python报错:数组与名称长度不一致
解决
pd.crosstab()报错:'arrays and names must have the same length' 嘿,咱们来搞定你遇到的这个pandas交叉表报错问题!
你碰到的这个错误,核心原因是你传入的行/列数组数量,和指定的名称列表长度不匹配。先看你写的代码:
cid = np.array(b.customerID) state = np.array(b.State) pd.crosstab(ind, [cid, state], rownames=['cid'], colnames=['state'], dropna = False)
这里有两个明显的问题:
ind变量根本没定义啊!你没给交叉表的行传入有效数据- 你给列参数传了两个数组
[cid, state],但colnames=['state']只有一个名称——数量对不上,这就是触发报错的直接原因
正确实现方案
根据你的需求(基于customerID和State创建交叉表),我猜你是想统计每个客户在不同州的出现次数,或者每个州的客户分布?那咱们来写正确的代码:
场景1:以客户ID为行,州为列(最常见需求)
import pandas as pd import numpy as np # 假设b是你的源DataFrame cross_table = pd.crosstab( index=b['customerID'], # 直接用DataFrame的列,不用转numpy数组也可以 columns=b['State'], rownames=['customerID'], # 行的名称,对应customerID列 colnames=['State'], # 列的名称,对应State列 dropna=False ) print(cross_table)
场景2:确实需要多层列(同时用客户ID和州作为列)
如果你真的需要把cid和state都作为列的层级,那得给colnames传一个长度为2的列表,和你传入的列数组数量对应:
# 假设你有一个行维度的变量,比如购买月份 cross_table = pd.crosstab( index=b['purchase_month'], columns=[b['customerID'], b['State']], rownames=['purchase_month'], colnames=['customerID', 'State'], # 两个名称对应两个列数组 dropna=False )
小提示
- 没必要手动把DataFrame的列转成numpy数组,直接传入
b['customerID']这种形式更简洁,还能避免额外的长度问题 - 确保你的源数据列(
customerID和State)长度一致——如果它们来自同一个DataFrame,这一点肯定没问题,但如果是手动生成的数组,记得检查下长度哦
内容的提问来源于stack exchange,提问作者Himalaya Mandal
相关产品推荐
相关产品推荐

