从pandas数据帧中的行到行比较中提取数据

时间:2016-04-27 11:50:22

标签: python pandas

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

1 个答案:

答案 0 :(得分:3)

我认为您可以使用merge创建catdrop_duplicatesid汇总sizegroupby的所有组合:

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