我有一个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列重复此操作。因此,我们需要迭代两列的每个唯一组合。
执行此操作的蛮力方式是嵌套循环,一次迭代两列。我想知道是否有熊猫方法。
答案 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-1
(N
列数)相等性和求和要比检查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