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