如何在组中查找缺失值

时间:2019-07-23 02:57:47

标签: python pandas distinct-values

我有大量的餐厅检查数据集。一项检查将触发若干违反代码的行为。我想找出是否任何检查都没有违反特定的法规(针对有害生物的证据)。我将数据保存在Pandas数据框中。

我尝试根据是否包括对害虫的违法行为来分离数据框。我试图按违规代码分组。似乎无法弄清楚。

如果有害生物违规为“ 3A”,则数据可能类似于:

import pandas as pd

df = pd.DataFrame(data = {
    'visit' : ['1', '1', '1', '2', '2', '3', '3'],
    'violation' : ['3A', '4B', '5C', '3A', '6C', '7D', '8E']
    })
  visit violation
0     1        3A
1     1        4B
2     1        5C
3     2        3A
4     2        6C
5     3        7D
6     3        8E

我想结束这个:

result = pd.DataFrame(data = {
    'visit' : ['3', '3'], 'violation' : ['7D', '8E']
    })
Out[15]: 
  visit violation
0     3        7D
1     3        8E

3 个答案:

答案 0 :(得分:1)

尝试使用:

value = '3A'
print(df.groupby('visit').filter(lambda x: all(value != i for i in x['violation'])))

输出:

  violation visit
5        7D     3
6        8E     3

答案 1 :(得分:0)

另一种方法是:

violation_visits = df[df['violation']=='3A']['visit'].unique()
df[~df['visit'].isin(violation_visits.tolist())]

Out[16]: 
  visit violation
5     3        7D
6     3        8E

答案 2 :(得分:0)

使用过滤器的一种方法

df.groupby('visit').filter(lambda x : ~x['violation'].eq('3A').any())
  visit violation
5     3        7D
6     3        8E

使用transform

的另一种方法
df[df.violation.ne('3A').groupby(df.visit).transform('all')]
  visit violation
5     3        7D
6     3        8E