计算CSV文件中Python中的特定事件
问题内容:
我有一个包含4列{Tag,User,Quality,Cluster_id}的csv文件。使用python,我想执行以下操作:对于每个cluster_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
问题答案:
既然有人已经发布了defaultdict
解决方案,那么我将为熊猫提供一个解决方案。
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
文件处理,那么绝对值得一看。