如何删除3列以上具有相同值的行

2024-04-16 09:25:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的数据框。你知道吗

A   B   C   D   E   F   G
1   4   9   4   6   9   8
2   2   2   2   2   5   9
2   2   2   2   2   2   2
2   6   9   5   4   4   5
2   8   1   9   5   8   9
2   2   2   5   6   3   6

我需要输出如下:

A   B   C   D   E   F   G
1   4   9   4   6   9   8
2   6   9   5   4   4   5
2   8   1   9   5   8   9
2   2   2   5   6   3   6

意思是rows having more than three columns as same value应该被删除。 我们可以看到第二行和第三行分别有5列和7列作为相同的值。我们需要删除那些行。你知道吗

有谁能帮帮我吗。你知道吗


Tags: columns数据valuemoreasrowsthreesame
3条回答

可以使用只有唯一值的集合。如果一行有3个相等的值,那么 len(set(row))=len(row)-2。 遍历数据帧以查找这些行并存储它们的索引。你知道吗

indexes_to_remove = []
for index, row in df.iterrows():
    if len(set(row)) < len(row) - 2:
        indexes_to_remove.append(index)

然后你就可以安全地移除它们了。你知道吗

下面是一个通过^{}^{}的天真熊猫循环:

def max_count(s):
    return s.value_counts().values[0]

res = df[df.apply(max_count, axis=1).le(3)]

print(res)

   A  B  C  D  E  F  G
0  1  4  9  4  6  9  8
3  2  6  9  5  4  4  5
4  2  8  1  9  5  8  9
5  2  2  2  5  6  3  6

进近#1

对于带有ints的数据帧,这里有一个带有bincount的矢量化数据帧-

# https://stackoverflow.com/a/46256361/ @Divakar
def bincount2D_vectorized(a):    
    N = a.max()+1
    a_offs = a + np.arange(a.shape[0])[:,None]*N
    return np.bincount(a_offs.ravel(), minlength=a.shape[0]*N).reshape(-1,N)

out = df[(bincount2D_vectorized(df.values)<=3).all(1)]

样本输出-

In [563]: df[(bincount2D_vectorized(df.values)<=3).all(1)]
Out[563]: 
   A  B  C  D  E  F  G
0  1  4  9  4  6  9  8
3  2  6  9  5  4  4  5
4  2  8  1  9  5  8  9
5  2  2  2  5  6  3  6

相关问题 更多 >