我想要比较两个大型数据帧。我想要一个比较结果,能够按百分比进行列和/或行相似的相似性比较。 这部分很简单。但是,我希望能够根据值标准进行比较忽略差异。下面是一个小例子。
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 = '--'
我希望它们被视为相等时(所以当一个'--'
基本上总是为真时),但是,否则执行正常的布尔比较。我需要一种有效的方法来做到这一点,不包括过多的循环,因为数据集非常大。
答案 0 :(得分:1)
下面,我正在解释“当一个人是' - '基本上永远是真的”意味着对'--'
的任何比较(无论其他值是什么)都应该返回True。在这种情况下,您可以使用
mask = (df1=='--') | (df2=='--')
找到df1
或df2
等于'--'
的每个位置,然后使用
comparison |= mask
更新comparison
。例如,
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))
答案 1 :(得分:0)
我认为循环理解应该非常快:
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。