首页 > 解决方案 > Pandas中变量相互出现的表

问题描述

我有一个不同类别变量的数据框,如下所示:

df:
    A    B    C    D
0   a    b    c    d
1   b    d    a    e
2   d    a    e    c

每行都有一个来自 ae 的变量,并且它们从不每列重复。我想知道并创建一个每个值在一行中出现的表。所需的数据框如下所示:

df2:
    x   a   b   c   d   e
0   a   NaN 2   2   3   2
1   b   2   NaN 1   2   1
2   c   2   1   NaN 2   1
3   d   3   2   2   NaN 1
4   e   2   1   1   1   NaN

我已经有了df2['x'],所以我已经有一列变量。

我能够通过以下方式计算出现次数并将它们映射到相应的变量:

for x in df['x']:
    df2[str(x)] = df2['x'].map(df.melt()['value'].value_counts())

    x   a   b   c   d   e
0   a   3   2   2   3   2
1   b   2   2   1   2   1
2   c   2   1   2   2   1
3   d   3   2   2   3   1
4   e   2   1   1   1   2

正如你所看到的,当它与自身进行制表时,我得到的是变量的总数,而不是 NaN。我希望从使用的功能中得到这一点。

有没有办法将这些值更改为 NaN?我最终想在可视化期间将它们更改为 0 或其他值,但是将它们作为 NaN 更简单,因为它们更容易找到(值是唯一且相同的)。

另外,当我迭代 df2['x'] 中的每个项目时,是否有一种更简单的方法来做我想做的事情?

标签: pythonpandas

解决方案


我们可以尝试 astack后跟mergeand crosstab

s = df.stack().reset_index(name='val')
s = s.merge(s, on='level_0').query('val_x!=val_y')

pd.crosstab(s.val_x, s.val_y)

输出:

val_y  a  b  c  d  e
val_x               
a      0  2  2  3  2
b      2  0  1  2  1
c      2  1  0  2  1
d      3  2  2  0  2
e      2  1  1  2  0

推荐阅读