使用Pandas在每列之间进行比较的最快方法

时间:2019-03-01 01:58:47

标签: python pandas

我有一个Excel文件,其中有100列,每列有1000个条目。这些条目中的每个条目只能采用3个特定的值(0.8、0.0和0.37),我想计算两列条目的每种组合之间的不匹配数。

例如,下面的excel工作表显示列之间的不匹配:

|---------------------|------------------|---------------------|---------------|
|      Column 1       |     Column 2     |      Column 3       |     Mismatch  |
|---------------------|------------------|---------------------|---------------|
|          0.37       |         0.8      |          0.0        |         3     |
|---------------------|------------------|---------------------|---------------|
|          0.0        |         0.0      |          0.8        |         2     |
|---------------------|------------------|---------------------|---------------|

首先,我们将第1列与第2列进行比较。由于第一行之间存在差异,因此我们在不匹配列的相应行中加1。我们分别对第1列和第3列重复此操作,然后对第2列和第3列重复此操作。因此,我们需要迭代两列的每个唯一组合。

执行此操作的蛮力方式是嵌套循环,一次迭代两列。我想知道是否有熊猫方法。

2 个答案:

答案 0 :(得分:3)

这就是我要解决的问题

from itertools import combinations
L = df.columns.tolist()
pd.concat([df[x[0]]!=df[x[1]] for x in list( combinations(L, 2))],axis=1).sum(1)
0    3
1    2
dtype: int64

答案 1 :(得分:1)

由于您将成对组合相加,因此与将第一列与第二列至最后一列进行检查,将第二列与第三列至最后一列进行检查相同,依此类推。根据{{​​1}}检查N-1N列数)相等性和求和要比检查DataFrame单个列配对要快很多,尤其是对于大量列:

NC2

一些与您的数据大小有关的时间

from functools import reduce

reduce(lambda x,y: x+y, [df.iloc[:, i+1:].ne(df.iloc[:, i], axis=0).sum(1) 
                          for i in range(len(df.columns)-1)])
0    3
1    2
dtype: int64

您可以使用import numpy as np import pandas as pd from itertools import combinations np.random.seed(123) df = pd.DataFrame(np.random.choice([0, 0.8, 0.37], (1000,100))) %timeit reduce(lambda x, y: x+y, [df.iloc[:, i+1:].ne(df.iloc[:, i], axis=0).sum(1) for i in range(len(df.columns)-1)]) #157 ms ± 659 µs per loop (mean ± std. dev. of 7 runs, 10 loops each) %timeit pd.concat([df[x[0]]!=df[x[1]] for x in list( combinations(L, 2))],axis=1).sum(1) #1.55 s ± 9.93 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 并略微增加一些数值,尽管会丢失索引:

numpy