我的问题如下:假设您有一个用二进制数字填充的数据框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]
答案 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行之间的差值。