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

Pandas: Compare a column to all other columns of a dataframe(Pandas:将一列与数据帧的所有其他列进行比较)
本文介绍了Pandas:将一列与数据帧的所有其他列进行比较的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个场景,我让新的主题接受一系列特征的测试,其中结果都是字符串分类值。测试完成后,我需要将新数据集与所有对象的主数据集进行比较,并查找给定阈值的相似性(匹配)(比方说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

利用skLearning的笛卡尔函数

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中除Characteristic之外的每一列创建一个带有键的词典。 请注意,这似乎是在浪费空间。也许只保存那些有火柴的?

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 Combos,并在Numpy的count_non Zero()的帮助下计算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'}]}

我很想知道它的性能如何。祝你好运!

这篇关于Pandas:将一列与数据帧的所有其他列进行比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)