如何按列数据框架pandas构建列

时间:2017-08-24 13:01:49

标签: pandas crosstab

我的数据框看起来像这个例子

A | B | C
__|___|___
s   s  nan
nan x  x

我想在这样的列之间创建一个交叉表

  | A    | B  | C
__|______|____|______
A | True |True| False
__|______|____|______
B | True |True|True
__|______|____|______
C | False|True|True
__|______|____|______

有一种优雅的无循环方式吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

设置

v = df.values

pd.DataFrame(
    (v[:, :, None] == v[:, None]).any(0),
    df.columns, df.columns
)

       A     B      C
A   True  True  False
B   True  True   True
C  False  True   True

选项1
您可以使用any广播来按列彼此评估每列。然后确定是否有任何比较sum

v = df.values

pd.DataFrame(
    (v[:, :, None] == v[:, None]).sum(0),
    df.columns, df.columns
)

   A  B  C
A  1  1  0
B  1  2  1
C  0  1  1

np.count_nonzero替换为sum,您可以计算出多少个交叉点。

v = df.values

pd.DataFrame(
    np.count_nonzero(v[:, :, None] == v[:, None], 0),
    df.columns, df.columns
)

   A  B  C
A  1  1  0
B  1  2  1
C  0  1  1

或使用d = pd.get_dummies(df.stack()).unstack(fill_value=0) d = d.T.dot(d) d.groupby(level=1).sum().groupby(level=1, axis=1).sum() A B C A 1 1 0 B 1 2 1 C 0 1 1 代替{{1}}

{{1}}

选项2
有趣&创意方式

{{1}}