数据透视表和计数

时间:2016-11-16 15:01:54

标签: python pandas pivot-table

我有一个数据集,表明谁在哪家商店购物。

ID  Store
1    C
1    A
2    A
2    B
3    A
3    B
3    C

我可以使用数据透视表来确定购物者前往其他商店的频率吗?我想像一个3X3矩阵,其中的列和行表示有多少人去过这两家商店。

Desired output
    A   B  C
A   3   2   2
B   2   3   1
C   2   1    3

2 个答案:

答案 0 :(得分:3)

您可以使用ID创建Storepd.crosstab()的条件表,然后计算其转置及其自身的矩阵乘积,这将产生您需要的内容:

mat = pd.crosstab(df.ID, df.Store)    
mat.T.dot(mat)

#Store  A   B   C
#Store          
#   A   3   2   2
#   B   2   2   1
#   C   2   1   2

注意:由于只有两个ID访问了商店BC,我认为相应的单元格应该是2而不是3:

答案 1 :(得分:2)

使用groupbyunstackdot的另一个更快的解决方案:

df = df.groupby(['ID','Store']).size().unstack(fill_value=0)
df = df.T.dot(df)
print (df)
Store  A  B  C
Store         
A      3  2  2
B      2  2  1
C      2  1  2

<强>计时

In [119]: %timeit (jez(df))
1000 loops, best of 3: 1.72 ms per loop

In [120]: %timeit (psi(df))
100 loops, best of 3: 7.07 ms per loop

时间安排的代码

N = 1000
df = pd.DataFrame({'ID':np.random.choice(5, N), 
                   'Store': np.random.choice(list('ABCDEFGHIJK'), N)})
print (df)


def jez(df):
    df = df.groupby(['ID','Store']).size().unstack(fill_value=0)
    return df.T.dot(df)

def psi(df):
    mat = pd.crosstab(df.ID, df.Store)    
    return mat.T.dot(mat)

print (jez(df))
print (psi(df))