Python Pandas比较两个大型文本数据帧的相似性



我有两个大的数据帧要比较。我想要一个能够按百分比对相似性进行列和/或行比较的比较结果<这个部分很简单>然而,我希望能够使比较忽略基于价值标准的差异。下面是一个小例子。

d1 = {'Sample':pd.Series([101,102,103]), 
      'Col1':pd.Series(['AA','--','BB']), 
      'Col2':pd.Series(['AB','AA','BB'])}
d2 = {'Sample':pd.Series([101,102,103]), 
      'Col1':pd.Series(['BB','AB','--']),
      'Col2':pd.Series(['AB','AA','AB'])}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
df1 = df1.set_index('Sample')
df2 = df2.set_index('Sample')
comparison = df1.eq(df2)
# for column stats
comparison.sum(axis=0) / float(len(df1.index))
# for row stats
comparison.sum(axis=1) / float(len(df1.columns))

我的问题是,当value1='AA' and value2 = '--'时,我希望它们被视为相等的(所以当一是'--'时,基本上总是真的),否则执行正常的布尔比较。我需要一种有效的方法来做到这一点,不包括过度的循环,因为数据集相当大。

下面,我将"当一个值为'-'时,基本上总是true"解释为任何与'--'的比较(无论其他值是什么)都应返回true。在这种情况下,您可以使用

mask = (df1=='--') | (df2=='--')

找到df1df2等于'--'的每个位置,然后使用

comparison |= mask

以更新CCD_ 7。例如,

import itertools as IT
import numpy as np
import pandas as pd
np.random.seed(2015)
N = 10000
df1, df2 = [pd.DataFrame(
    np.random.choice(map(''.join, IT.product(list('ABC'), repeat=2))+['--'], 
                     size=(N, 2)),
    columns=['Col1', 'Col2']) for i in range(2)]

comparison = df1.eq(df2)    
mask = (df1=='--') | (df2=='--')
comparison |= mask
# for column stats
column_stats = comparison.sum(axis=0) / float(len(df1.index))
# for row stats
row_stats = comparison.sum(axis=1) / float(len(df1.columns))

我认为循环理解应该很快:

new_columns = []
for col in df1.columns:
    new_columns.append([True if (x==y or x=='--' or y=='--') else False for x,y in zip(df1[col],df2[col])])
results = pd.DataFrame(new_columns).T
results.index = df1.index

这将输出完整的真/假df。

最新更新