所以我有一個稱為 datBaskets 的單熱編碼。行是交易,列是商店部門。如果第 i 個籃子包含第 j 個部門的商品,則第 ij 個條目為真,否則為假。它看起來像這樣......
| 清潔用品 | 電池 | 食物 | |
|---|---|---|---|
| 0 | 真的 | 真的 | 錯誤的 |
| 1 | 錯誤的 | 真的 | 真的 |
| 2 | 錯誤的 | 錯誤的 | 錯誤的 |
| 3 | 真的 | 錯誤的 | 錯誤的 |
| 4 | 真的 | 錯誤的 | 真的 |
| 5 | 錯誤的 | 真的 | 錯誤的 |
我尋求的是一個矩陣,其中部門既是行又是列,它告訴我包含該部門組合的所有交易的比例。因此,在這種情況下,Batteries-Food 條目將為 0.167。
uj5u.com熱心網友回復:
這是一個矢量化的解決方案。
首先,將布爾條目轉換為整數 ( df.astype(int))。然后計算df轉置 ( df.T) 和df使用@運算子(df.T.dot(df)也可以)之間的矩陣乘法。最后,將結果歸一化為交易數量 ( len(df))。
或者,使用DataFrame.round方法將結果四舍五入到小數點后 3 位。
df = df.astype(int)
res = ((df.T @ df) / len(df)).round(3)
>>> res
Cleaning Supplies Batteries Food
Cleaning Supplies 0.500 0.167 0.167
Batteries 0.167 0.500 0.167
Food 0.167 0.167 0.333
中間結果
>>> df.astype(int)
Cleaning Supplies Batteries Food
0 1 1 0
1 0 1 1
2 0 0 0
3 1 0 0
4 1 0 1
5 0 1 0
>>> df.T
0 1 2 3 4 5
Cleaning Supplies 1 0 0 1 1 0
Batteries 1 1 0 0 0 1
Food 0 1 0 0 1 0
>>> df.T @ df
Cleaning Supplies Batteries Food
Cleaning Supplies 3 1 1
Batteries 1 3 1
Food 1 1 2
>>> (df.T @ df) / len(df)
Cleaning Supplies Batteries Food
Cleaning Supplies 0.500000 0.166667 0.166667
Batteries 0.166667 0.500000 0.166667
Food 0.166667 0.166667 0.333333
uj5u.com熱心網友回復:
from io import StringIO
import numpy as np
import pandas as pd
s = """
Cleaning Supplies,Batteries,Food
True,True,False
False,True,True
False,False,False
True,False,False
True,False,True
False,True,False
"""
# read in your data
df = pd.read_csv(StringIO(s))
ncols = len(df.columns)
matrix = np.zeros((ncols, ncols)) # initialize empty array
# go through each point in matrix and assign value (this will take the % of True, True combinations)
for i, col1 in enumerate(df.columns):
for j, col2 in enumerate(df.columns):
matrix[i, j] = (df[col1] * df[col2]).mean()
df_matrix = pd.DataFrame(matrix, columns=df.columns, index=df.columns) # create a data frame that labels indices and columns
然后df_matrix看起來像這樣:
Cleaning Supplies Batteries Food
Cleaning Supplies 0.500000 0.166667 0.166667
Batteries 0.166667 0.500000 0.166667
Food 0.166667 0.166667 0.333333
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355473.html
下一篇:將選擇行映射到新列
