如何计算在DataFrame中仅出现一次的行?

时间:2019-02-28 16:04:19

标签: python pandas

我想计算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。

5 个答案:

答案 0 :(得分:9)

duplicated~创建的sum转换为True的值的布尔掩码(True1的过程):

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

答案 1 :(得分:1)

(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的行。

答案 2 :(得分:1)

这是一个numpy选项:

import numpy as np

_, cts = np.unique(df.values, axis=0, return_counts=True)
len(np.where(cts == 1)[0])
#2

答案 3 :(得分:0)

听起来像group byhaving子句的声音。

len(df.groupby(['a','b']).filter(lambda x: len(x) == 1).index)

2

答案 4 :(得分:0)

您可以使用重复的keep = False(否定)来计数不重复的内容。

df = pd.DataFrame({'a': [1, 1, 2, 3], 'b': [1, 1, 2, 2]})
duplicates_s = df.duplicated(keep=False)
(~duplicates_s).sum()