4

{Tag、User、Quality、Cluster_id}の4列の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ファイルの各行を取得できました。

一度にアクセスできるのは各行のみで、2つのforループはありません。実装したいアルゴリズムの疑似コードは次のとおりです。

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

2 に答える 2

3

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
于 2013-01-26T19:47:56.793 に答える
2

誰かがすでに解決策を投稿しているので、バラエティのため にパンダdefaultdictをあげます。データ処理に非常に便利なライブラリです。他の優れた機能の中でも、必要な出力の種類に応じて、このカウントの問題を1行で処理できます。本当に: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、一見の価値があります。

于 2013-01-26T20:46:40.953 に答える