【问题标题】:Counting particular occurrences in python in csv file在 csv 文件中计算 python 中的特定事件
【发布时间】:2017-04-30 21:05:02
【问题描述】:

我有一个包含 4 列 {Tag、User、Quality、Cluster_id} 的 csv 文件。使用 python 我想做以下事情:对于每个 cluster_id(从 1 到 500),我想查看每个用户的好标签和坏标签的数量(从质量列获得)。有超过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 循环。我要实现的算法的伪代码是:

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

【问题讨论】:

  • 一些演示数据会有所帮助。
  • 这里的问题应该是经过你的努力后才提出来的,你有什么尝试?
  • 我已经编辑了我的问题,希望能更清楚
  • 我对stackoverflow中的格式化不熟悉,但我已经尽力解释了这个问题。
  • 我修复了 Python 代码中的格式。

标签: python csv


【解决方案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

【讨论】:

  • 我正在尝试使用 pandas 和 collections.defaultdict 这两种方法,但是使用这种方法我得到错误:user = data.[cluster].setdefault(user,defaultdict(int)) ^SyntaxError: invalid语法
  • @user1992696 - 抱歉,data[cluster] 中有一个错误的时间段。
  • 它似乎工作,但我得到这个作为输出:Cluster: 490 User: 0 4 User: 1 8 但我希望用户列中具有 user_id 的用户以及每个用户的正值和负值。像用户:user_001 正面:23 负面:4 如何修改代码以获得这样的结果?
【解决方案2】:

既然有人已经发布了defaultdict 解决方案,我将提供一个pandas 解决方案,只是为了多样化。 pandas 是一个非常方便的数据处理库。在其他不错的功能中,它可以在一行中处理此计数问题,具体取决于所需的输出类型。真的:

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

--

为了说明pandas 的简单之处,我们可以加载文件——pandas 中的主要数据存储对象称为“DataFrame”:

>>> import pandas as pd
>>> df = pd.read_csv("cluster.csv")
>>> df
<class 'pandas.core.frame.DataFrame'>
Int64Index: 500000 entries, 0 to 499999
Data columns:
Tag           500000  non-null values
User          500000  non-null values
Quality       500000  non-null values
Cluster_id    500000  non-null values
dtypes: int64(1), object(3)

我们可以检查前几行是否正常:

>>> 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

然后我们可以按 Cluster_id 和 User 分组,并在每个组上工作:

>>> 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 文件进行大量处理,那么绝对值得一看。

【讨论】:

  • 我在读取 csv 文件时遇到问题。列标签包含用户输入的标签,所以它有像“”这样的字符,; 17 世纪,空格,# 是用户错误输入的。当我尝试打开 csv 文件时,它显示错误:CParserError: Error tokenizing data.
  • 嗨。使用这种方法,有没有办法将结果写入 csv 文件。我尝试了以下。我尝试使用values = group["quality"].value_counts() 连续打印不同质量指标的值并将值打印到 csv 文件,但我只获取这些值。有没有一种方法可以让我将列名作为不同类型的质量,例如:有用性-有用、无用、有问题等以及它们在 csv 文件中的相应计数。 @DSM
猜你喜欢
  • 2019-06-17
  • 2015-01-07
  • 1970-01-01
  • 2015-06-27
  • 2019-04-04
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多