Pandas:将列与数据帧的所有其他列进行比较

2024-02-20

我有一个场景,我有新的受试者正在测试一系列特征,其中结果都是字符串分类值。测试完成后,我需要将新数据集与所有受试者的主数据集进行比较,并寻找给定阈值(例如 90%)的相似性(匹配)。

因此,我需要能够以尽可能最佳的性能对新数据集中的每个新主题与主数据集中的每一列以及新数据集中的其他列进行柱状(按主题)比较因为生产数据集大约有 50 万列(并且还在增长)和 10,000 行。

这是一些示例代码:

master = pd.DataFrame({'Characteristic':['C1', 'C2', 'C3'], 
                                   'S1':['AA','BB','AB'],
                                   'S2':['AB','-','BB'],
                                   'S3':['AA','AB','--']})
new = pd.DataFrame({'Characteristic':['C1', 'C2', 'C3'], 
                                'S4':['AA','BB','AA'],
                                'S5':['AB','-','BB']})
new_master = pd.merge(master, new, on='Characteristic', how='inner')  

def doComparison(comparison_df, new_columns, master_columns):
  summary_dict = {}
  row_cnt = comparison_df.shape[0]

  for new_col_idx, new_col in enumerate(new_columns):
      # don't compare the Characteristic column
      if new_col != 'Characteristic':
        print 'Evalating subject ' + new_col + ' for matches'
        summary_dict[new_col] = []
        new_data = comparison_df.ix[:, new_col]
        for master_col_idx, master_col in enumerate(master_columns):
            # don't compare same subject or Characteristic column
            if new_col != master_col and master_col != 'Characteristic':
                master_data = comparison_df.ix[:, master_col]
                is_same = (new_data == master_data) & (new_data != '--') & (master_data != '--')
                pct_same = sum(is_same) * 100 / row_cnt
                if pct_same > 90:
                    print '  Found potential match ' + master_col + ' ' + str(pct_same) + ' pct'
                    summary_dict[new_col].append({'match' : master_col, 'pct' : pct_same})
  return summary_dict

result = doComparison(new_master, new.columns, master.columns)

这种方法可行,但我想提高效率和性能,但不知道如何实现。


另外一个选择

import numpy as np
import pandas as pd
from sklearn.utils.extmath import cartesian

利用 sklearn 的笛卡尔函数

col_combos = cartesian([ new.columns[1:], master.columns[1:]])
print (col_combos)

[['S4' 'S1']
 ['S4' 'S2']
 ['S4' 'S3']
 ['S5' 'S1']
 ['S5' 'S2']
 ['S5' 'S3']]

为 new 中除特征之外的每一列创建一个带有键的字典。 请注意,这似乎是浪费空间。也许只保存那些有火柴的?

summary_dict = {c:[] for c in new.columns[1:]} #copied from @Parfait's answer

Pandas/Numpy 可以轻松比较两个系列。
例子;

print (new_master['S4'] == new_master['S1'])

0     True
1     True
2    False
dtype: bool

现在我们迭代 Series 组合并借助 numpy 的 count_nonzero() 来计算 True。其余的与你所拥有的类似

for combo in col_combos:
    match_count = np.count_nonzero(new_master[combo[0]] == new_master[combo[1]])
    pct_same = match_count * 100 / len(new_master)
    if pct_same > 90:
        summary_dict[combo[0]].append({'match' : combo[1], 'pct': match_count / len(new_master)})

print (summary_dict)

{'S4': [], 'S5': [{'pct': 1.0, 'match': 'S2'}]}

我很想知道它的表现如何。祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas:将列与数据帧的所有其他列进行比较 的相关文章

随机推荐

  • Python:字典列表,如何获取列表中多个项目的特定键的值?

    我有一个字典列表 例如 dict list key1 dict1 value1 key2 dict1 value2 key3 dict1 value3 key1 dict2 value1 key2 dict2 value2 key3 dic
  • 每行创建多边形并保留列

    早上好 下午好或晚上好 我已将一些位置数据分组到 1 小时的分组中 对于每个我都提取了最小的纬度和经度 它看起来像这样 df lt ID time bin count lat lon maxlat minlat maxlon minlon
  • nginx 连接到 .sock 失败(13:权限被拒绝)- 502 错误网关

    我正在使用 nginx uwsgi django 在 centos7 上部署我的第一个站点 它们在测试中单独工作得很好 但我在尝试将它们连接在一起时遇到了 502 bad gateway var log nginx error log 文件
  • D3.js:折线图 - 工具提示和悬停垂直线

    我一直在研究使用 D3 js 构建的交互式折线图 一次悬停时 我希望工具提示以垂直线显示 垂直线效果很好 但是 我遇到了与工具提示相关的问题 工具提示位置不在图表上 我只获取第一个数据元素 这是我的代码 margin top 20 righ
  • 如何减小 iPython 笔记本的文件大小?

    我有一个 IPython 笔记本 虽然里面的代码只有 100 行左右 但它有几兆字节大 我认为它那么大 因为我在里面加载了几张图像 我想将此笔记本添加到 git 存储库 但是 我不想上传那么大的东西 这样很容易再次生成 是否可以仅保存 IP
  • C# 如何反序列化嵌入文本中的 xml 标签?

    我正在尝试使用 XmlSerializer 反序列化 NET 的 XML 文档注释的输出 作为参考 xml 文档的输出如下所示
  • 在循环内部还是外部声明变量更好?

    最好这样做 variable1Type foo variable2Type baa foreach var val in list foo new Foo foo x FormatValue val baa new Baa baa main
  • Vim Fugitive:Gblame 重责选项

    我最近一直在使用Fugitive的Gblame 但不太明白 reblame 的作用 有人可以更清楚地描述这些选项的作用吗 reblame at commit reblame at count th first grandparent P r
  • 为什么赋值表达式 [String x = (x = y)] 的变量初始化可以编译?

    这个如何编译才不会报错呢 据我了解 编译器检查变量的类型 在本例中String 然后查看右侧表达式的类型是否对应于变量的类型 或至少是一个子类型 但让我们坚持使用简单的情况String类 因为它是最后的 public class InitC
  • 在实体框架中自定义类型映射

    我正在使用 EF5 Code First 并尝试存储 IPAddress 对象 如果您尝试直接执行此操作 EF 会将其存储为两列 FIELDNAME Address 和 FIELDNAME Scope 不幸的是 这不足以存储 IPv4 地址
  • 寻找基于 Django 类的视图并在单个页面上具有多个表单示例

    我一直在寻找如何使用较新的基于 Django 类的视图方法在一页上显示 2 个独特的表单 有人可以参考一下吗 或者提供一个基本的例子 谷歌并没有因此成为我的 朋友 关键是你甚至不必使用其中之一FormView处理表单的子类 您只需添加手动处
  • BluetoothLEDevice.FromIdAsync 返回 null

    这是用于获取 BLE 设备的 UWP 代码 为什么我在某些设备上得到 bleDevice null 我没有找到任何解释这一点的文档 var devices await DeviceInformation FindAllAsync Bluet
  • Xcode - Segue 问题

    我一直在努力让segue继续工作 我写了以下内容 但由于某种原因 preparesegue 方法不会触发 我已经阅读了其他相关的帖子 但我无法让它启动 而且同样重要的是 我需要的变量没有被传输 m file implementation C
  • jQuery - 检查是否第一次点击

    我有 2 个函数 A 和 B 只需单击一次 div 即可调用 我只需要在第一次单击时调用函数 A 并在单击时调用函数 B 我怎么能这样做呢 更简单的解决方案 element one click function Call A click f
  • 调整 Datagridview 上的 Rowheader 属性

    在 Winforms DataGridView 中 我该如何 删除行标题上的箭头 我需要显示行标题文本 所以我不能简单地设置RowHeadersVisible false 以编程方式调整行标题的宽度 我通过代码设置行标题 因此我需要调整宽度
  • 通过Matplotlib中的OO接口获取图形管理器

    我希望能够获取创建的图形的figure manager 例如我可以使用 pyplot 界面来完成此操作 from pylab import figure plot arange 100 mngr get current fig manage
  • MS Access XML 从文本或流而不是文件导入?

    有什么简单的方法可以完成与 Application ImportXML 等效的操作 但将 XML 作为字符串或文本流而不是文件 在 Access 2003 中 我想将记录插入到一 个包含许多字段的表中 其中包含来自应用程序中不同位置的数据
  • spring资源是文件还是目录?

    我正在使用 spring Resource API 并使用 ResourcePatternResolver 来扫描我的类路径中的文件 在一种情况下 扫描会拾取预构建 jar 中的一些目录和文件以及文件系统上的一些目录和文件 在任何一种情况下
  • AppDomains 与强大的服务器

    经过一些研究后 AppDomains 似乎并不是真正构建托管服务器的工具 根据我的理解 如果创建的AppDomain中存在未处理的异常 如果从创建的AppDomain中的线程抛出异常 托管服务器仍然会崩溃 因此 在这种情况下 如果托管服务器
  • Pandas:将列与数据帧的所有其他列进行比较

    我有一个场景 我有新的受试者正在测试一系列特征 其中结果都是字符串分类值 测试完成后 我需要将新数据集与所有受试者的主数据集进行比较 并寻找给定阈值 例如 90 的相似性 匹配 因此 我需要能够以尽可能最佳的性能对新数据集中的每个新主题与主