Hello其他程序员,
我和熊猫有问题(再次),这里是:
我有一个庞大的数据框,让我们总结一下:
id categories
0 id_1 cat_1
1 id_1 cat_2
2 id_2 cat_2
3 id_2 cat_1
4 id_3 cat_1
5 id_3 cat_1
6 id_3 cat_3
(看起来很大并不是吗?创建它的代码:)
df = pd.DataFrame([['id_1','cat_1'],['id_1','cat_2'],['id_2','cat_2'],['id_2','cat_1'],['id_3','cat_1'],['id_3','cat_1'],['id_3','cat_3']],columns = ['id','cat'])
由此我想创建一个数据框,其中包含每个类别中购买两个类别的客户数量。
然后我会得到: categories1 categories2 amount
0 cat_1 cat_1 3
1 cat_1 cat_2 2
2 cat_1 cat_3 1
3 cat_2 cat_1 2
4 cat_2 cat_2 2
5 cat_2 cat_3 0
6 cat_3 cat_1 1
7 cat_3 cat_2 0
8 cat_3 cat_3 1
然后我可以将其更改为带有类别作为索引的矩阵和带有数据透视的列(如果我可以执行矩阵,没有此临时数据框,我很乐意了解如何)。
问题是我无法在我的行上循环完成这个数据帧,这是非常长的! (甚至做得有点聪明,比如使用对称性,或者使用groupby作为cat_i / cat_i行等等。)。
编辑:如果我可以构建一个填充0和1的矩阵类别/ id用于标记,如果在cat_j中购买了id_i,我可以按照以下方法生成所需的矩阵:Pairwise matrix from a pandas dataframe
答案 0 :(得分:3)
我认为您可以使用merge
创建cat
,drop_duplicates
和id
汇总size
列groupby
的所有组合:
df1 = pd.merge(df,df, on='id').drop_duplicates()
print df1
id cat_x cat_y
0 id_1 cat_1 cat_1
1 id_1 cat_1 cat_2
2 id_1 cat_2 cat_1
3 id_1 cat_2 cat_2
4 id_2 cat_2 cat_2
5 id_2 cat_2 cat_1
6 id_2 cat_1 cat_2
7 id_2 cat_1 cat_1
8 id_3 cat_1 cat_1
10 id_3 cat_1 cat_3
14 id_3 cat_3 cat_1
16 id_3 cat_3 cat_3
print df1.groupby(['cat_x','cat_y']).size().reset_index(name='Amount')
cat_x cat_y Amount
0 cat_1 cat_1 3
1 cat_1 cat_2 2
2 cat_1 cat_3 1
3 cat_2 cat_1 2
4 cat_2 cat_2 2
5 cat_3 cat_1 1
6 cat_3 cat_3 1