2017-04-10 86 views
0

在下表中,我试图确保1个学生ID有1个名称。例如,Student_ID101有2个与其关联的名称(Adam和Bob)。所以我想获得Student_ID确保列数据具有1对1匹配

我需要的结果是ID:101(因为它有2个与它相关的名字)。

Student_ID Name Text 
101 Adam 234 
200 Cat 45645 
101 Adam 5476456 
200 Cat 34 
101 Bob 456 
200 Cat 456 
200 Cat 4356 
300 Cat 356 

我该如何解决这个问题?我不认为我们可以用字典。我只需要一个方向来解决这个问题。

+0

那么,建议的解决方案有帮助吗? – IanS

回答

1

通过Student_ID分组和将所述函数nunique将由ID计数名的数量:

df.groupby('Student_ID')['Name'].nunique() 

您可以筛选结果的上方,或过滤直接原始数据帧:

df.groupby('Student_ID').filter(lambda group: group['Name'].nunique() > 1) 
0

字典是一个好主意。用它来映射学生姓名以计算其被看到的次数。

import csv 

students = {} 

with open('test.csv') as fp: 
    next(fp) # skip header 
    for row in csv.reader(fp, delimiter=' ', skipinitialspace=True): 
     if row: 
      student = row[1] 
      if student in students: 
       students[student] += 1 
      else: 
       students[student] = 1 

for student, count in students.items(): 
    if count > 1: 
     print(student, "present mutliptle times") 

它的这样一个好主意,python在collections.Counter中实现了一个。给这个类一个迭代器,它将创建一个字典,计算该迭代器中给定值的出现次数。

import collections 

with open('test.csv') as fp: 
    next(fp) # skip header 
    students = collections.Counter(row[1] 
     for row in csv.reader(fp, delimiter=' ', skipinitialspace=True) 
     if row) 

for student, count in students.items(): 
    if count > 1: 
     print(student, "present mutliptle times")