确保列数据与1到1匹配

时间:2017-04-10 15:05:31

标签: python pandas

在下表中,我正在尝试确保1个学生ID有1个名字。例如,Student_ID 101有2个与之关联的名称(Adam和Bob)。所以我想得到Student_ID

我需要的结果是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

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

2 个答案:

答案 0 :(得分:1)

Student_ID分组并应用函数nunique将按ID计算名称数量:

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

您可以过滤上面的结果,也可以直接过滤原始数据框:

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

答案 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")