Python 数据透视表与计数

Python 数据透视表与计数,python,pandas,pivot-table,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 您可以使用pd.crosstab()创建一个ID和Store的条件表,然后计

我有一个数据集,显示谁在哪家商店购物

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

您可以使用
pd.crosstab()
创建一个
ID
Store
的条件表,然后计算其转置和自身的矩阵积,这将产生您需要的:

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访问了store
B
C
,我认为相应的单元格应该是2而不是3:

您可以使用
pd.crosstab()
创建一个ID和
store
的条件表,然后计算其转置和自身的矩阵积,这将产生您所需要的:

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访问了store
B
C
,因此我认为相应的单元格应该是2而不是3:

另一个更快的解决方案,并且:

计时

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))
计时代码

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))

另一个更快的解决方案,包括:

计时

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))
计时代码

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))