如何逐列构建数据框 pandas

How to build column by column dataframe pandas

我有一个类似于此示例的数据框

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

我想像这样在列之间创建一个 table 交集

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

有没有优雅的无循环方式呢?

谢谢!

设置

df = pd.DataFrame(dict(A=['s', np.nan], B=['s', 'x'], C=[np.nan, 'x']))

选项 1
您可以使用 numpy 广播来评估每一列的每一列。然后确定是否有任何比较是 True

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

通过将 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

选项 2
有趣且有创意的方式

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