Python 使用pandas对成对类别进行计数,以从整洁格式的数据帧返回数据透视图

Python 使用pandas对成对类别进行计数,以从整洁格式的数据帧返回数据透视图,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,如附加的屏幕截图: 要创建数据帧,请使用以下代码段: import pandas as pd buyer_id=['aaa', 'bbb', 'aac', 'aaa', 'bbb'] category=['mobile', 'laptop', 'laptop', 'grocery', 'mobile'] data_tuples = list(zip(buyer_id,category)) df=pd.DataFrame(data_tuples, columns=['Bu

我有一个数据框,如附加的屏幕截图: 要创建数据帧,请使用以下代码段:

import pandas as pd 

buyer_id=['aaa',
'bbb',
'aac',
'aaa',
'bbb']

category=['mobile',
'laptop',
'laptop',
'grocery',
'mobile']

data_tuples = list(zip(buyer_id,category))

df=pd.DataFrame(data_tuples, columns=['Buyer_ID','Category'])
我想创建一个新的数据框,它看起来像屏幕截图中所需的输出。 基本上计算成对的买家id,比如手机和手机应返回2,手机和杂货店应返回1,杂货店和笔记本电脑应返回0等

尝试使用groupby、pivot等,但不起作用。仅返回同一类别的值,即移动和移动

一种方法可能是采用pd.get_dummies()并在一个go-on buyer_id级别对两列进行求和,并对求和等于2的行进行计数,这在Pandas中是否有更简单的方法?

使用,索引和列名称的最后更改顺序为,删除索引和列名称为:

与一起使用,索引和列名的最后更改顺序为,删除索引和列名的方法为:

i = df['Category'].unique()
df1 = df.merge(df, on='Buyer_ID')  
df = (pd.crosstab(df1['Category_x'],df1['Category_y'])
        .reindex(index=i, columns=i)
        .rename_axis(index=None, columns=None))
print (df)
         mobile  laptop  grocery
mobile        2       1        1
laptop        1       2        0
grocery       1       0        1