#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. вы можете
set
и проверить, где ваша ошибка. Нравитсяprint(set(cleaned_data))
. помните, чтоdata
это alist
с именами, оно не включает другие поля.
Ответ №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))