我想计算DataFrame
中只出现一次的行数。例如,在下面的示例中,我返回2,因为只有行索引2和3出现一次:
In [1]: df = pd.DataFrame({'a': [1, 1, 2, 3], 'b': [1, 1, 2, 2]})
In [2]: df
Out[2]:
a b
0 1 1
1 1 1
2 2 2
3 3 2
(这与询问唯一行的数量不同,在这种情况下,每个df.drop_duplicates().shape[0]
的行数为3。
由~
和duplicated
创建的sum
反转布尔掩码计算True
s值(True
是像1
这样的过程):
out = (~df.duplicated(keep=False)).sum()
print (out)
2
细节:
print (df.duplicated(keep=False))
0 True
1 True
2 False
3 False
print (~df.duplicated(keep=False))
0 False
1 False
2 True
3 True
dtype: bool
(df.groupby(df.columns.tolist()).size() == 1).sum()
在幕后,这是:
In [33]: df.groupby(df.columns.tolist()).size()
Out[33]:
a b
1 1 2
2 2 1
3 2 1
dtype: int64
size
计算每个组合的行数,然后将其与1的行相加。
这是一个numpy
选项:
import numpy as np
_, cts = np.unique(df.values, axis=0, return_counts=True)
len(np.where(cts == 1)[0])
#2
听起来你想要相当于group by
和having
条款。
len(df.groupby(['a','b']).filter(lambda x: len(x) == 1).index)
2
您可以使用重复的keep = False(否定)来计算非重复数。
df = pd.DataFrame({'a': [1, 1, 2, 3], 'b': [1, 1, 2, 2]})
duplicates_s = df.duplicated(keep=False)
(~duplicates_s).sum()