编写一个函数,返回数据集中列中唯一名称的数目-Python
我目前正在尝试编写一个函数,该函数将整数作为数据集(我已经有了一个,名为编写一个函数,返回数据集中列中唯一名称的数目-Python,python,Python,我目前正在尝试编写一个函数,该函数将整数作为数据集(我已经有了一个,名为data)。并在此数据集中查找名为name的列。然后它必须返回列中不同类型名称的数量(有4个值,但只有3种类型的值——其中两种是相同的) 我在这个项目上经历了一段艰难的时光,但到目前为止我已经做到了: def name_count(data): unique = [] for name in data: if name.strip() not in unique: un
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
是否有人可以提供有关此问题的任何帮助或建议?您可以使用
集合
来防止重复,例如:
data = ['name1', 'name2', 'name3', 'name3 ']
cleaned_data = map(lambda x: x.strip(), data)
count = len(set(cleaned_data))
print(count)
>>> 3
你差点就成功了。Unique应该是字典,而不是列表
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}
您需要将完整的数据集传递给函数,而不仅仅是整数。如果要将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))
目前尚不清楚您已经拥有了哪种类型的
数据变量
因此,我将提出一个解决方案,从读取文件开始。
考虑到您有一个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
列中的所有项目收集到变量name
中,最后返回集合的长度,其中只包含唯一的元素。请提供一个样本数据集id、名称、级别、个性、类型、弱点、atk、def、hp、,第59阶段,阿卡宁,35,小鬼,火,水,50,55,90,2 59,阿卡宁,35,温柔,火,水,45,60,80,2 121,斯塔米,67,萨西,水,电,174,56113,2 131,拉普拉斯,72,拉克斯,水,电,107113,29,1
据我所知,你想拥有列名的唯一值。你可以这样做:data['name'].nunique()@BillyBonaros没有Pandas?你的数据是Pandas数据帧格式吗?嗯,当我运行这个时,结果是5。我假设这是因为这个数据集中有5行。你知道我如何解决这个问题吗?你可以打印出结果,并检查错误所在。如打印(设置(清洁的数据))
。请记住,data
是一个带有名称的列表,它不包括其他字段。嗯,当我运行这个时,它不会返回任何内容。。。我是否在这里遗漏了什么???@jen_hen1只要您将数据作为列表,此函数将返回一个包含每个名称计数的字典。请参阅我添加到代码中的测试。我希望只返回名称数的整数。对于你的例子,输出应该是4,因为有4种不同类型的名称。如果这是你想要的,它非常简单。在代码的最后一行中写入return len(unique),而不是return unique。它给出了字典的长度,与唯一名称的数量相同,4。嗯,这就是我目前拥有的,但它仍然没有返回任何内容def name_count(data):unique={}数据中的名称:if name.strip()在unique:unique[name]+=1其他:unique[name]=1返回len(unique)
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))