2016-06-17 9 views
0

の更新:は、共通データをCSV行をマージして、私は次のようなデータをCSVを持ってカウント

DOCUMENT_ID | body_mention |カウント

doc_01 |ボブ| 5

doc_03 |サム| 1

doc_04 |ボブ| 1

body_mentionは、テキストから解析された名前であり、countは、特定のドキュメント(document_id)にその名前が何回出現したかを示します。したがって、Bobはdoc_01に5回出現しました。

しかし、私は私のCSVがボブの発生は、単に以前のボブ・エントリを更新しますので、新しいアップデートがどのように見えるように更新する:

DOCUMENT_ID | body_mention |カウント

doc_01、doc_04 |ボブ| 6

doc_03 |サム| 1

どのように私はこれをスクリプト化を開始することができる任意のアイデア?

答えて

0

それは少し厄介ですが、あなたはあなたが「didnのドキュメントのすべての値

import csv 
import collections 

name_sum = collections.defaultdict(int) 
docs_for_name = collections.defaultdict(list) 

with open("csv1.csv") as csvfile: 
    csvreader = csv.reader(csvfile) 
    for row in csvreader: 
     name_sum[row[1]] += int(row[2]) 
     docs_for_name[row[1]].append(row[0]) 

with open("outputcsv.csv", "w", newline="") as csvfile: 
    csvwriter = csv.writer(csvfile) 
    for key in sorted(name_sum.keys()): 
     row = [", ".join(sorted(docs_for_name[key])), key, str(name_sum[key])] 
     print(row) 
     csvwriter.writerow(row) 

の合計を維持するために、すべてそれぞれの人のためのドキュメントや他のトラックを保持するために、2つのdefaultdicts、いずれかを使用することができます

doc_01,Bob,5 
doc_03,Sam,1 
doc_04,Bob,1 

これは以下のようにcsvファイルを出力し終わる:トンcsvファイルをExcelなどのエディタでのように見えるので、私はあなたのcsvファイルを仮定していることは、このように見えるだけで何、実際のcsvファイルを投稿

"doc_01, doc_04",Bob,6 
doc_03,Sam,1 

enter image description here

それはすべてを追跡するために

defaultdict(<class 'int'>, {'Bob': 6, 'Sam': 1}) 

そして、他のdefaultdictのように見える終わるように、第1 defaultdict、name_sumだけで、それぞれの名前のすべての値のために合計を追跡します名前のためのドキュメント、docs_for_nameはのように見える終わる:次に、あなたが書くために必要なすべての情報を持っている

defaultdict(<class 'list'>, {'Bob': ['doc_01', 'doc_04'], 'Sam': ['doc_03']}) 

新しいcsvファイルの各行

0

csvは、pandasからimport pandas as pd; pd.read_csv()を使用して読み取ることができます。次に、あなたのデータは以下のように、Dataframe内部に保存することができます。

rslt = pd.concat([df.groupby('body_mention').sum(), df.groupby('body_mention').apply(lambda x: ','.join(x['document_id']))], axis=1).reset_index() 
rslt.columns = ['body_mention', 'count', 'document_id'] 

説明:その後

df 
Out[86]: 
    document_id body_mention count 
0  doc_01   Bob  5 
1  doc_03   Sam  1 
2  doc_04   Bob  1 

、あなたが望むものを達成するために、あなたは、コードの2行以下使用することができます:Finallly

In [91]: rslt = pd.concat([df.groupby('body_mention').sum(), df.groupby('body_mention').apply(lambda x: ','.join(x['document_id']))], axis=1).reset_index() 

In [92]: rslt 
Out[92]: 
    body_mention count    0 
0   Bob  6 doc_01,doc_04 
1   Sam  1   doc_03 

In [93]: rslt.columns = ['body_mention', 'count', 'document_id'] 

In [94]: rslt 
Out[94]: 
    body_mention count document_id 
0   Bob  6 doc_01,doc_04 
1   Sam  1   doc_03 

、あなたはを使用することができますを使用して結果データフレームをcsvに保存します。

psの、あなただけの下に使用し、正確な順序に従うことを出力列をしたい場合:

rslt = rslt[['document_id', 'body_mention', 'count']] 

rslt 
Out[99]: 
    document_id body_mention count 
0 doc_01,doc_04   Bob  6 
1   doc_03   Sam  1 
0

はこれを試してみてください:

df.groupby("body_mention")['document_id'].apply(lambda x: ','.join(x)) 

# body_mention 
# Bob doc_01,doc_04 
# Sam   doc_03 
# Name: document_id, dtype: object 

df.groupby("body_mention")['count'].sum() 

#body_mention 
# Bob 6 
# Sam 1 
# Name: count, dtype: int64 

だから、この2行:

dfOut= pd.concat([df.groupby("body_mention")['count'].sum(),df.groupby("body_mention")['document_id'].apply(lambda x: ','.join(x)) ], axis=1) 
    dfOut.to_csv('out.csv',sep = "|") 

CSVファイル:

body_mention|count|document_id 
Bob|6|doc_01,doc_04 
Sam|1|doc_03 
関連する問題