我有一个如下所示的数据框
| FName | F1 | F2 | F3|
| A | 0 | 1 | 1 |
| B | 1 | 0 | 1 |
| C | 1 | 0 | 0 |
| D | 1 | 1 | 1 |
从这里我需要找到每列的成对设置交集的计数,即F1-F2为1,F1-F3为2,F2-F3为2,依此类推。
一种显而易见的方法是将每个系列转换为set
数据结构,然后采用集合交集,后跟结果集的长度。但是大熊猫有没有办法实现同样的目标呢?
答案 0 :(得分:3)
答案 1 :(得分:2)
numpy
bool
广播
d1 = df.set_index('FName')
v = d1.values.astype(bool)
pd.DataFrame(
(v.reshape(4, 1, 3) & v.reshape(4, 3, 1)).sum(0),
d1.columns, d1.columns
)
F1 F2 F3
F1 3 1 2
F2 1 2 2
F3 2 2 3
或使用np.einsum
执行点积
d1 = df.set_index('FName')
v = d1.values
pd.DataFrame(
np.einsum('ij,jk->ik', v.T, v),
d1.columns, d1.columns
)
F1 F2 F3
F1 3 1 2
F2 1 2 2
F3 2 2 3
与np.dot
d1 = df.set_index('FName')
v = d1.values
# python 3 should be able to do `v.T @ v`
pd.DataFrame(
v.T.dot(v),
d1.columns, d1.columns
)
时间测试