我正在尋找一種基于條件將資料框的列與其自身內部連接的方法。我有一個由“組”和“個人”兩列組成的大型資料框。現在我想創建第二個資料框,它有一個每個人元組的條目,它一直在同一個組中。第一個資料框:
Group | Person
a1 | p1
a1 | p2
a1 | p3
a1 | p4
a2 | p1
輸出:
Person1 | Person2 | Weight
p1 | p2 | 1
p1 | p3 | 1
p1 | p4 | 1
p2 | p3 | 1
p2 | p4 | 1
p3 | p4 | 1
如果一組人是多個組的一部分,則權重會增加。到目前為止,我能夠基于一個子資料框和兩個 for 回圈創建一個簡單的實作。有沒有更優雅,更重要的是,更快/內置的方式來做到這一點?
到目前為止我的實作:
group = principals.iloc[i,0]
sub = principals.loc[principals['Group'] == group]
for j in range(len(sub)-1):
for k in range (j 1,len(sub)):
#check if tuple exists -> update or create new entry
我在想,是否有類似SQL內連接的功能,基于組相同的條件,然后以人對人的方式連接。在這種情況下,我可以處理雙 p1|p1 條目......
提前謝謝了
uj5u.com熱心網友回復:
combinations會給你你正在尋找的元組對。一旦你得到這些,你可以將元組組合分解成行。然后你weight是每對的組大小 - 在這種情況下為 1 因為它們都只存在于一個組中。
import pandas as pd
import numpy as np
from itertools import combinations
df = pd.DataFrame({'Group': ['a1', 'a1', 'a1', 'a1', 'a2'],
'Person': ['p1', 'p2', 'p3', 'p4', 'p1']})
df = (
df.groupby('Group')['Person']
.apply(lambda x: tuple(combinations(x,2)))
.explode()
.dropna()
.reset_index()
)
df['Weight'] = df.groupby('Person').transform(np.size)
df[['Person1','Person2']] = df['Person'].apply(pd.Series)
df = df[['Person1','Person2','Weight']]
print(df)
輸出
Person1 Person2 Weight
0 p1 p2 1
1 p1 p3 1
2 p1 p4 1
3 p2 p3 1
4 p2 p4 1
5 p3 p4 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/422938.html
標籤:
