计算csv文件中python中的特定出现次数
我有一个csv文件,有4列{Tag,User,Quality,Cluster_id}。使用python,我想做以下工作:对于每个集群id(从1到500),我想看到每个用户的好标签和坏标签的数量(从quality列获得)。有6000多个用户。我只能在csv文件中逐行读取。因此,我不知道如何做到这一点 例如:计算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
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.]