Написание функции, которая возвращает количество уникальных имен в столбце в наборе данных — Python

#python

#python

Вопрос:

В настоящее время я пытаюсь написать функцию, которая принимает целое число в наборе данных (тот, который у меня уже есть, с именем data ). И ищет столбец в этом вызываемом наборе name данных . Затем он должен вернуть количество имен разных типов, имеющихся в столбце (есть 4 значения, но только 3 типа значений — два из них одинаковые).

Мне трудно работать с этой программой, но это то, что у меня есть до сих пор:

 def name_count(data):
    unique = []
    for name in data:
        if name.strip() not in unique:
            unique[name]  = 1
        else:
            unique[name] = 1
            unique.append(name)
 

Единственный импорт, который мне разрешено использовать для этой задачи, это math .

У кого-нибудь есть какая-либо помощь или совет, которые они могут предложить с этой проблемой?

Комментарии:

1. Пожалуйста, предоставьте образец набора данных

2. id,name,level,personality,type,weakness,atk,def,hp,stage 59,Arcanine,35,impish,fire,water,50,55,90,2 59,Arcanine,35,gentle,fire,water,45,60,80,2 121,Starmie,67,sassy,water,electric,174,56,113,2 131,Lapras,72,lax,water,electric,107,113,29,1

3. Насколько я понимаю, вы хотите иметь уникальные значения имени столбца. Вы можете сделать это так: data[‘name’].nunique()

4. @BillyBonaros Без панд?

5. Ваши данные представлены в формате фрейма данных Pandas?

Ответ №1:

Вы можете использовать a set , чтобы сохранить дубликаты из него, например:

 data = ['name1', 'name2', 'name3', 'name3   ']

cleaned_data = map(lambda x: x.strip(), data)
count = len(set(cleaned_data))

print(count)
>>> 3
 

Комментарии:

1. Хм, когда я запускаю это, я получаю 5 в результате. Я предполагаю, что это потому, что в этом наборе данных 5 строк. Вы знаете, как я могу это исправить?

2. вы можете print получить результат set и проверить, где ваша ошибка. Нравится print(set(cleaned_data)) . помните, что data это a list с именами, оно не включает другие поля.

Ответ №2:

У вас почти получилось. Уникальным должен быть словарь, а не список.

 def name_count(data):
    unique = {}
    for name in data:
        if name.strip()  in unique:
            unique[name]  = 1
        else:
            unique[name] = 1
    return unique

#test
print(name_count(['Jack', 'Jill', 'Mary', 'Sam', 'Jack', 'Mary']))

#output
{'Jack': 2, 'Jill': 1, 'Mary': 2, 'Sam': 1}
 

Комментарии:

1. Хм, когда я запускаю это, оно ничего не возвращает… Возможно, я что-то здесь упускаю??

2. @jen_hen1 Пока ваши данные представлены в виде списка, эта функция будет возвращать словарь с количеством каждого имени. Посмотрите тест, который я добавил в код.

3. Я хочу просто вернуть целое число от количества имен. Итак, для вашего примера вывод будет 4, потому что существует 4 разных типа имен.

4. Если это то, что вы хотите, это очень просто. Вместо return unique напишите return len(уникальный) в последней строке кода. Это дает вам длину словаря, которая совпадает с количеством уникальных имен, 4.

5. Хм, так это то, что у меня есть на данный момент, но оно по-прежнему ничего не возвращает. def name_count(data): unique = {} for name in data: if name.strip() in unique: unique[name] = 1 else: unique[name] = 1 return len(unique)

Ответ №3:

 def name_count(data):
  df = pandas.DataFrame(data)
  unique = []
  for name in df["name"]:  #if column name is "name"
    if name:
      if (name not in unique) :
        unique.append(name)
  return unique
 

Вам нужно передать функции полный набор данных, а не только целые числа.

Ответ №4:

Неясно, какая data переменная у вас там уже есть.

Итак, я предложу решение, начиная с чтения файла. Учитывая, что у вас есть файл csv и что существует ограничение на импорт только math модуля (как вы упомянули), тогда это должно сработать.

 def name_count(filename):
    with open(filename, 'r') as fh:
        headers = next(fh).split(',')
        name_col_idx = headers.index('name')
        names = [
            line.split(',')[name_col_idx]
            for line in fh
        ]
        return len(set(names))
 

Здесь мы читаем первую строку, определяем местоположение name в заголовке, собираем все элементы в name столбце в переменную names и, наконец, возвращаем длину набора, который содержит только уникальные элементы.

Ответ №5:

Вот решение, если вы отправляете файл csv в свою функцию. Он считывает файл csv, удаляет строку заголовка, накапливает имена, которые находятся в индексе 1 каждой строки, преобразует список в набор, чтобы избавиться от дубликатов, и возвращает длину набора, которая совпадает с количеством уникальных имен.

 import csv
def name_count(filename):
    with open(filename, "r") as csvfile:
        csvreader = csv.reader(csvfile)
        names = [row[1] for row in csvreader if row][1:]
        return len(set(names))
 

В качестве альтернативы, если вы не хотите использовать программу чтения csv, вы можете использовать программу чтения файлов tect без какого-либо импорта следующим образом. Код разбивает каждую строку на запятые.

 def name_count(filename):
    with open(filename, "r") as input:
        names = [row.rstrip('n').split(',')[1] for row in input if row][1:]
        return len(set(names))