我有一个像这样的数据框(基本上是两列:首先包含博客ID,第二列包含粉丝):
blogger follower
A c
A d
A e
A f
A g
A h
A i
A j
A k
B c
B f
B g
B l
B m
B n
B o
B p
B q
B r
B s
B t
B k
C a
C k
C r
C g
C t
C c
C p
C y
C z
C w
我想得到的是一个具有全部交叉计数的方阵,如下所示:
A B C
A - 4 3
B 4 - 6
C 3 6 -
我不是一个熟练的熊猫用户,我所做的就是通过使用2个循环和np.intersect来实现这一点,我认为这样做效率不高。我一直试图使用pivot_table(),crosstab()和groupby() - 没有运气,所以很遗憾没有代码可以分享。也许有人知道一个有效的解决方案吗?
答案 0 :(得分:5)
执行自我merge
,然后执行crosstab
操作。
i = df.merge(df, on='follower')
j = pd.crosstab(i.blogger_x, i.blogger_y)
j
blogger_y A B C
blogger_x
A 9 4 3
B 4 13 6
C 3 6 10
当然,对角线不是-
,但这很容易。
j = j.astype(object)
j.values[[np.arange(j.shape[0])] * 2] = '-'
j
blogger_y A B C
blogger_x
A - 4 3
B 4 - 6
C 3 6 -
请注意,这会破坏性能,因为您的列现在是对象类型,这是在同一列中混合不同类型的值的唯一方法。