我有一个数据集,表明谁在哪家商店购物。
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
答案 0 :(得分:3)
您可以使用ID
创建Store
和pd.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访问了商店B
和C
,我认为相应的单元格应该是2而不是3:
答案 1 :(得分:2)
使用groupby
,unstack
和dot
的另一个更快的解决方案:
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))