Pandas中基于不同列的互值配对

jjhzyzn0  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(123)

假设我有下一个数据集

NAME   FRIEND
     --------------
     John    Ella
     John    Ben
     Ella    John
     Ella    Ben
     Dave    Ben
     ...
     More Values

我想得到John、Ella和Dave的共同朋友的列表。在这个例子中,输出应该是['Ben']
我已经尝试过用loc实现这一点,但我不会得到预期的输出,并会得到"朋友的不是相互的。['Ella', 'Ben', 'John', 'Ben']
我已经找了一段时间的答案,找不到一个我可能会复制的答案。

b5lpy0ml

b5lpy0ml1#

您可以使用crosstab

ct = pd.crosstab(df['NAME'], df['FRIEND'])

out = ct.columns[ct.all()].to_list()

或用集合运算:

s = df.groupby('FRIEND')['NAME'].agg(set)
out = s.index[s.eq(set(df['NAME']))].to_list()

输出:['Ben']
中间交叉表:

FRIEND  Ben  Ella  John
NAME                   
Dave      1     0     0
Ella      1     0     1
John      1     1     0

中间体s

FRIEND
Ben     {Ella, Dave, John}
Ella                {John}
John                {Ella}
Name: NAME, dtype: object
如果要明确匹配{'Ella', 'Dave', 'John'},即使NAME:中有其他名称
target = ['Ella', 'Dave', 'John']

ct = pd.crosstab(df['NAME'], df['FRIEND'])

out = ct.columns[ct.reindex(target).all()].to_list()

或者;

target = {'Ella', 'Dave', 'John'}
s = df[df['NAME'].isin(target)].groupby(df['FRIEND'])['NAME'].agg(set)
out = s.index[s.eq(target)].to_list()

相关问题