Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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
计算csv文件中python中的特定出现次数_Python_Csv - Fatal编程技术网

计算csv文件中python中的特定出现次数

计算csv文件中python中的特定出现次数,python,csv,Python,Csv,我有一个csv文件,有4列{Tag,User,Quality,Cluster_id}。使用python,我想做以下工作:对于每个集群id(从1到500),我想看到每个用户的好标签和坏标签的数量(从quality列获得)。有6000多个用户。我只能在csv文件中逐行读取。因此,我不知道如何做到这一点 例如: Columns of csv = [Tag User Quality Cluster] Row1= [bag u1 good 1] Row2 = [ground u2 b

我有一个csv文件,有4列{Tag,User,Quality,Cluster_id}。使用python,我想做以下工作:对于每个集群id(从1到500),我想看到每个用户的好标签和坏标签的数量(从quality列获得)。有6000多个用户。我只能在csv文件中逐行读取。因此,我不知道如何做到这一点

例如:

Columns of csv = [Tag User Quality Cluster]   
Row1= [bag  u1  good     1]  
Row2 = [ground u2 bad   2]  
Row3 = [xxx  u1 bad  1]  
Row4 = [bbb  u2 good 3]  
我刚刚获得了csv文件的每一行

我一次只能访问每一行,没有两个for循环。我要实现的算法的psedudocode是:

for cluster in clusters:  
    for user in users:  
        if eval == good:  
            good_num = good_num +1  
        else:  
            bad_num = bad_num + 1

collections.defaultdict
在这里应该有很大的帮助:

# WARNING: Untested
from collections import defaultdict

auto_vivificator = lambda: defaultdict(auto_vivificator)

data = auto_vivificator()

# open your csv file

for tag, user, quality, cluster in csv_file:
    user = data[cluster].setdefault(user, defaultdict(int))
    if is_good(quality):
        user["good"] += 1
    else:
        user["bad"] += 1

for cluster, users in enumerate(data):
    print "Cluster:", cluster
    for user, quality_metrics in enumerate(users):
       print "User:", user
       print quality_metrics
       print  # A blank line

既然有人已经发布了一个
defaultdict
解决方案,我将给出一个,只是为了多样化
pandas
是一个非常方便的数据处理库。在其他优秀的特性中,它可以在一行中处理这个计数问题,这取决于需要什么样的输出。真的:

df = pd.read_csv("cluster.csv")
counted = df.groupby(["Cluster_id", "User", "Quality"]).size()
df.to_csv("counted.csv")
--

为了给
pandas
提供一个简单的预告片,我们可以加载文件--
pandas
中的主要数据存储对象称为“数据帧”:

然后我们可以按群集id和用户分组,并对每个组进行操作:

>>> for name, group in df.groupby(["Cluster_id", "User"]):
...     print 'group name:', name
...     print 'group rows:'
...     print group
...     print 'counts of Quality values:'
...     print group["Quality"].value_counts()
...     raw_input()
...     
group name: (1, 'u003')
group rows:
        Tag  User Quality  Cluster_id
372002  xxx  u003     bad           1
counts of Quality values:
bad    1

group name: (1, 'u004')
group rows:
           Tag  User Quality  Cluster_id
126003  ground  u004     bad           1
348003  ground  u004    good           1
counts of Quality values:
good    1
bad     1

group name: (1, 'u005')
group rows:
           Tag  User Quality  Cluster_id
42004   ground  u005     bad           1
258004  ground  u005     bad           1
390004  ground  u005     bad           1
counts of Quality values:
bad    3
[etc.]

如果您要对
csv
文件进行大量处理,那么一定值得一看。

一些演示数据会很有帮助。在您的努力下,应该会问一些问题,您尝试了什么?我已经编辑了我的问题,希望能说得更清楚我不熟悉stackoverflow中的格式,但是我已经尽力解释了这个问题。我修复了Python代码中的格式。我在读取csv文件时遇到了问题。列标记包含用户输入的标记,因此它具有类似“”的字符;17世纪,用户错误进入的空间。当我试图打开csv文件时,它显示错误:CParserError:error tokenized data.Hi。使用此方法,可以将结果写入csv文件。我尝试了以下方法。我尝试使用
values=group[“quality”].value\u counts()
将不同质量指标的值打印到一行中,并将值打印到csv文件中,但我仅获取值。有没有一种方法,我可以得到不同类型的质量列名,例如:有用的,没有用的,有问题的等,以及它们在csv文件中各自的计数@DSMI正在使用pandas和collections.defaultdict尝试这两种方法,但使用此方法我得到错误:user=data。[cluster].setdefault(user,defaultdict(int))^SyntaxError:无效syntax@user1992696-抱歉,
data[cluster]
中出现了一段错误时间。它似乎起作用了,但我将其作为输出:
Cluster:490 User:0 4 User:1 8
,但我希望用户id为User列中的用户以及每个用户的正值和负值。类似user:user_001肯定:23否定:4如何修改代码以获得这样的结果?
>>> df[:5]
   Tag  User Quality  Cluster_id
0  bbb  u001     bad          39
1  bbb  u002     bad          36
2  bag  u003    good          11
3  bag  u004    good           9
4  bag  u005     bad          26
>>> for name, group in df.groupby(["Cluster_id", "User"]):
...     print 'group name:', name
...     print 'group rows:'
...     print group
...     print 'counts of Quality values:'
...     print group["Quality"].value_counts()
...     raw_input()
...     
group name: (1, 'u003')
group rows:
        Tag  User Quality  Cluster_id
372002  xxx  u003     bad           1
counts of Quality values:
bad    1

group name: (1, 'u004')
group rows:
           Tag  User Quality  Cluster_id
126003  ground  u004     bad           1
348003  ground  u004    good           1
counts of Quality values:
good    1
bad     1

group name: (1, 'u005')
group rows:
           Tag  User Quality  Cluster_id
42004   ground  u005     bad           1
258004  ground  u005     bad           1
390004  ground  u005     bad           1
counts of Quality values:
bad    3
[etc.]