我在数据框下方。
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列相同的值。我们需要删除这些行。
有什么可以帮助我的吗?
答案 0 :(得分:2)
这是通过pd.DataFrame.apply
和pd.Series.value_counts
的幼稚的熊猫循环:
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 :(得分:1)
方法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
答案 2 :(得分:0)
您可以使用仅具有唯一值的集合。如果一行有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)
然后您可以安全地删除它们。