Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个函数,返回数据集中列中唯一名称的数目-Python_Python - Fatal编程技术网

编写一个函数,返回数据集中列中唯一名称的数目-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))