我有两个大的数据帧要比较。我想要一个能够按百分比对相似性进行列和/或行比较的比较结果<这个部分很简单>然而,我希望能够使比较忽略基于价值标准的差异。下面是一个小例子。这个部分很简单>
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=='--')
找到df1
或df2
等于'--'
的每个位置,然后使用
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。