在数据框中获取相似的行,每列仅更改1个值或更多

时间:2019-06-21 18:10:39

标签: python python-3.x pandas

我的问题如下:假设您有一个用二进制数字填充的数据框NxM:

pd.DataFrame([[0, 0, 0, 1, 0, 1],
              [0, 1, 0, 1, 0, 1],
              [1, 0, 0, 0, 0, 0],
              [1, 1, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0],
              [1, 1, 0, 0, 1, 0]]

我想获得两个相似行的索引或行(按行迭代),它们仅改变每列1个或更多值。例如,第一行的相似度是:

  • 如果它们每列仅更改一个值:

第0行:[0, 0, 0, 1, 0, 1]->预期输出[0, 1, 0, 1, 0, 1]
第2行:[1, 0, 0, 0, 0, 0]->预期输出[1, 1, 0, 0, 0, 0]

  • 如果它们每列更改两个值:

第2行:[1, 0, 0, 0, 0, 0]->预期输出[1, 1, 0, 0, 1, 0]
第4行:[0, 0, 0, 0, 1, 0]->预期输出[1, 1, 0, 0, 1, 0]

2 个答案:

答案 0 :(得分:0)

您可以移动记录。移位后,您可以比较值以返回True / False。在此之后,您可以计算真实值。我为该示例设置true == 1,因此您在各行之间只有1个更改。

我不确定您的具体结局应该是什么样子,但也许您可以改善这一点。

print(df)

print(df.shift(-1))

df[df[df == df.shift(-1)].isna().sum(axis=1) == 1]
   0  1  2  3  4  5
0  0  0  0  1  0  1
1  0  1  0  1  0  1
2  1  0  0  0  0  0
3  1  1  0  0  0  0
4  0  0  0  0  1  0
5  1  1  0  0  1  0

     0    1    2    3    4    5
0  0.0  1.0  0.0  1.0  0.0  1.0
1  1.0  0.0  0.0  0.0  0.0  0.0
2  1.0  1.0  0.0  0.0  0.0  0.0
3  0.0  0.0  0.0  0.0  1.0  0.0
4  1.0  1.0  0.0  0.0  1.0  0.0
5  NaN  NaN  NaN  NaN  NaN  NaN

Out[54]: 
   0  1  2  3  4  5
0  0  0  0  1  0  1
2  1  0  0  0  0  0

答案 1 :(得分:0)

一种可能性是使用汉明距离在行之间具有成对的距离:

import sklearn.metrics
comparisons = sklearn.metrics.pairwise_distances(df.values,metric='hamming')
nb_of_differences = (comparisons * df.shape[1]).astype(int)

汉明距离计算2个向量不同的位置数。最后,您将得到一个矩阵,该矩阵给出了第i行与第j行之间的差值。