我的数据框看起来像这个例子
A | B | C
__|___|___
s s nan
nan x x
我想在这样的列之间创建一个交叉表
| A | B | C
__|______|____|______
A | True |True| False
__|______|____|______
B | True |True|True
__|______|____|______
C | False|True|True
__|______|____|______
有一种优雅的无循环方式吗?
谢谢!
答案 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}}