我有一張像:
─────── ────────
| Name | Pet |
─────── ────────
| Alice | Dog |
| Bob | Dog |
| Clyde | Horse |
| Dave | Dog |
| Alice | Cat |
| Bob | Cat |
─────── ────────
我想計算 (Person1, Person2) 共同擁有的寵物的數量,所以在這個表中,它會是這樣的:
──────── ──────── ───────────────────────────────────
| Name1 | Name2 | Pet |
──────── ──────── ───────────────────────────────────
| Alice | Bob | 2 (because both have Dogs, Cats) |
| Alice | Clyde | 0 |
| Alice | Dave | 1 |
| Bob | Clyde | 0 |
| Bob | Dave | 1 |
| Clyde | Dave | 0 |
──────── ──────── ───────────────────────────────────
uj5u.com熱心網友回復:
在 Python 空間中作業可能會對此有所幫助:
from itertools import combinations
temp = pd.DataFrame(combinations(df.Name.unique(), 2),
columns=['Name1', 'Name2'])
mapp = df.groupby('Name').Pet.agg(set)
tempo = temp.assign(Name1 = temp.Name1.map(mapp),
Name2 = temp.Name2.map(mapp))
Pet_count = [len(a.intersection(b))
for a, b in zip(tempo.Name1, tempo.Name2)]
temp.assign(Pet = Pet_count)
Name1 Name2 Pet
0 Alice Bob 2
1 Alice Clyde 0
2 Alice Dave 1
3 Bob Clyde 0
4 Bob Dave 1
5 Clyde Dave 0
uj5u.com熱心網友回復:
設定
df = pd.DataFrame(
{
"Name":["Alice", "Bob", "Clyde", "Dave", "Alice", "Bob"],
"Pet":["Dog", "Dog", "Horse", "Dog", "Cat", "Cat"],
}
)
我們可以獲得一個由每個人索引的表(資料框),這為我們提供了他們是否擁有特定寵物的真實值
has_pet = pd.get_dummies(df["Pet"]).groupby(df["Name"]).sum()
has_pet 看起來像這樣
Cat Dog Horse
Alice 1 1 0
Bob 1 1 0
Clyde 0 0 1
Dave 0 1 0
選擇兩個人,共同寵物的數量等于他們行之間的點積。我們可以使用一個操作來計算這個Dataframe.dot
common_matrix = has_pet.dot(has_pet.transpose())
common_matrix 看起來像這樣
Alice Bob Clyde Dave
Alice 2 2 0 1
Bob 2 2 0 1
Clyde 0 0 1 0
Dave 1 1 0 1
這有你需要的資料。為了獲得您想要的格式,我們可以執行以下操作。
(
common_matrix
.melt(ignore_index=False) # turns the column headers to a single column of names
.rename(columns={"Name":"Name2"}) # rename the column to avoid a name clash with index, which is also called Name
.reset_index()
.query("Name < Name2") # used standard alphabetical order to remove repeated values
)
結果是
Name Name2 value
4 Alice Bob 2
8 Alice Clyde 0
9 Bob Clyde 0
12 Alice Dave 1
13 Bob Dave 1
14 Clyde Dave 0
您可以對Name列進行排序以獲得所需的答案(如果有必要)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331599.html
