【问题标题】:Calculating co-occurrence between pairs of columns in pandas [duplicate]计算熊猫中的列对之间的共现[重复]
【发布时间】:2021-11-08 12:21:19
【问题描述】:

我有一个包含 1 或 0 值的数据集,用于识别样品 (S) 中是否存在给定的矿物质 (M)。示例如下,但数据集本身包含 160 个样本中的大约 100 种矿物。

import numpy as np
import pandas as pd

data = np.array([['S1', '1', '1', '0', '0'],
                 ['S2', '0', '1', '0', '1'],
                 ['S3', '1', '1', '1', '1'],
                 ['S4', '0', '0', '0', '1']])
                   

minerals = ['Sample', 'M1', 'M2', 'M3', 'M4']

df = pd.DataFrame(data, columns=minerals).set_index('Sample')

co_occurrence = pd.DataFrame(columns=minerals[1:], index=minerals[1:])

对于每对矿物,我需要确定它们在名为 co_occurrence 的单独数据框中同时出现的频率;也就是说,我需要比较 df 中的每一列对,确定这些列中两种矿物的存在位置 (1),将这些出现相加并在 co_occurrence 中输入匹配的总数。

在给出的示例中,M1:M2 对的共现值应为 2,因为它们在 df 中一起出现两次。

我该怎么做?

【问题讨论】:

  • 下面是回答还是欺骗需要什么?预期输出如何?

标签: python-3.x pandas


【解决方案1】:

您可以使用以下内容:

from itertools import combinations

df = df.astype(int)

co_occurrence = (pd.Series({(c1,c2): (df[c1]&df[c2]).sum()
                            for c1,c2 in combinations(df.columns, 2)})
                   .unstack(-1)
                )

输出:

     M2   M3   M4
M1  2.0  1.0  1.0
M2  NaN  1.0  2.0
M3  NaN  NaN  1.0

【讨论】:

  • 因为这似乎不是co_occurrence矩阵,思考。
  • 我在问题下添加评论。
  • @geolguy 这是你需要的吗?还有另一种解决方案链接为潜在的重复,它提供了不同的格式
  • @mozway 是的,这对我很有效,谢谢。我看到另一个解决方案最终会为您提供相同的总数,但在任一方向上成对可读,这在这里不是必需的。
猜你喜欢
  • 2016-01-20
  • 2018-12-25
  • 2022-08-16
  • 2017-05-10
  • 2021-12-13
  • 1970-01-01
  • 2018-10-29
  • 2019-10-14
相关资源
最近更新 更多