Python Pandas比较2个大文本数据框架的相似性

时间:2015-12-30 19:01:10

标签: python pandas dataframe

我想要比较两个大型数据帧。我想要一个比较结果,能够按百分比进行列和/或行相似的相似性比较。 这部分很简单。但是,我希望能够根据值标准进行比较忽略差异。下面是一个小例子。

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 = '--'我希望它们被视为相等时(所以当一个'--'基本上总是为真时),但是,否则执行正常的布尔比较。我需要一种有效的方法来做到这一点,不包括过多的循环,因为数据集非常大。

2 个答案:

答案 0 :(得分:1)

下面,我正在解释“当一个人是' - '基本上永远是真的”意味着对'--'的任何比较(无论其他值是什么)都应该返回True。在这种情况下,您可以使用

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

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

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。