Python 使用交叉表计算类别列的交叉计数

Python 使用交叉表计算类别列的交叉计数,python,pandas,crosstab,Python,Pandas,Crosstab,我有一张客户购买产品类别的表格。 我正试图建立一个交叉销售矩阵,计算每两个产品类别的唯一客户,并有一个具有唯一数量的总数 pandas.crosstab是一种很好的开始方式,但小计失败(即margins=True) 然后pd.交叉表(dd.categ\u x,dd.categ\u y,margins=True)给出: | categ_x | a | b | All | |---------|---|---|-----| | a | 3 | 2 | 5 | | b

我有一张客户购买产品类别的表格。 我正试图建立一个交叉销售矩阵,计算每两个产品类别的唯一客户,并有一个具有唯一数量的总数

pandas.crosstab
是一种很好的开始方式,但小计失败(即
margins=True

然后
pd.交叉表(dd.categ\u x,dd.categ\u y,margins=True)
给出:

| categ_x | a | b | All | 
|---------|---|---|-----| 
| a       | 3 | 2 | 5   | 
| b       | 2 | 4 | 6   | 
| All     | 5 | 6 | 11  | 
pd.merge
有助于用交叉表中的正确数字填充单元格,但会导致小计/边距计数错误

我所期望的是:

| categ_x | a | b | All | 
|---------|---|---|-----| 
| a       | 3 | 2 | 3   | -- I have 3 unique clients with 'a'
| b       | 2 | 4 | 4   | -- I have 4 unique clients with 'b'
| All     | 3 | 4 | 5   | -- I have 5 unique clients in total
我试过一些伯爵,尤尼克。。。到目前为止没有多少成功

编辑

答案很好,但我想知道他们是否可以直接通过
交叉表
,使用正确的
aggfunc

,通过和手动计算值和添加值:

另一个类似的解决方案:

s = df2.groupby(['categ'])['cust'].nunique().rename('All')
df = pd.crosstab(dd.categ_x, dd.categ_y).join(s).append(s)
df.loc['All','All'] = df2['cust'].nunique()
df = df.astype(int)
print (df)
         a  b  All
categ_x           
a        3  2    3
b        2  4    4
All      3  4    5
您可以通过和手动计算值和添加值:

另一个类似的解决方案:

s = df2.groupby(['categ'])['cust'].nunique().rename('All')
df = pd.crosstab(dd.categ_x, dd.categ_y).join(s).append(s)
df.loc['All','All'] = df2['cust'].nunique()
df = df.astype(int)
print (df)
         a  b  All
categ_x           
a        3  2    3
b        2  4    4
All      3  4    5

我想这正是我需要的:

pd.crosstab(
    dd.categ_x, dd.categ_y, margins=True, 
    values=dd.cust, aggfunc=pd.Series.nunique
)
给出:

| categ_x | a | b | All |
|---------|---|---|-----|
| a       | 3 | 2 | 3   |
| b       | 2 | 4 | 4   |
| All     | 3 | 4 | 5   |

pd.Series.nunique
给出了
值的唯一值的长度/大小(此处
dd.cust
)。

我想这就是我需要的:

pd.crosstab(
    dd.categ_x, dd.categ_y, margins=True, 
    values=dd.cust, aggfunc=pd.Series.nunique
)
给出:

| categ_x | a | b | All |
|---------|---|---|-----|
| a       | 3 | 2 | 3   |
| b       | 2 | 4 | 4   |
| All     | 3 | 4 | 5   |

pd.Series.nunique
给出了
值的唯一值的长度/大小(此处
dd.cust
)。

谢谢,这绝对有用。我只是想知道它是否可以在一次调用
交叉表
中完成,谢谢这绝对是有用的。我只是想知道它是否可以通过调用
交叉表来完成