3

次のような csv データセットがあります。

A, 10, USA
B,30, UK
C,4,IT
A,20,UK
B,10,USA

このcsv行を読んで、次の出力を提供したい:

A has ran 30 miles with average of 15. 
B has ran 30 miles with average of 20.
C has ran 4 miles with average of 4. 

これまでの私の解決策は、csvデータを読み取って辞書に変換し、それらを繰り返し処理して、「A」が繰り返された回数と、平均のために計算する必要があった値を確認し、最終的に結果を生成することです. 私はすでにこのコードを書いていますが、A が繰り返された回数を効率的に計算し、マイルを合計して最終的な出力を作成するのに苦労しています。Pythonでこれを行う考えはありますか? C# でこれを行うのは簡単ですが、Python はあまり得意ではありません。

def main(filename):
    f = open(filename,'r')
    labels = ['name','miles','country']
    data = csv.DictReader(f,labels,delimiter=',')
    for line in data:
        print (line['name']+"  " + "has ran" +"   "+  line['miles']+" "+"miles")

    f.close()
4

3 に答える 3

6

a を使用しdefaultdictて値を保存し、出力できます。

import csv

from collections import defaultdict

with open(filename, 'r') as handle:
    reader = csv.DictReader(handle, ['name', 'miles', 'country'])
    data = defaultdict(list)

    for line in reader:
        data[line['name']).append(int(line['miles']))

    for runner, distances in data.items():
        print '{} ran a total of {} miles and an average of {} miles'.format(
            runner, sum(distances), sum(distances) / float(len(distances))
        )
于 2013-03-14T02:39:46.697 に答える
1

次のことができます。

  1. データにヘッダー行を追加します (「ランナー、距離、国」など)。
  2. ファイルに保存します (例: log.csv)。
  3. ここで load_csv 関数を使用してロードします: https://github.com/kdavies4/ModelicaRes/blob/master/modelicares/util.py#L676 そこに util.py ファイルをダウンロードし、次の手順を実行します。

    from util import load_csv
    d = load_csv("log.csv")
    

    次の辞書になるはずです。

    d = {'Runner': ['A', 'B', 'C', 'A', 'B'], 'Distance': [10, 30, 4, 20, 10], 'Country': ['USA', 'UK', 'IT', 'UK', 'USA']}
    

    load_csv 関数は csv.reader を使用して、ヘッダー行で見つかったエントリにちなんで名付けられたキーを持つディクショナリを自動的に作成します。各キーのディクショナリ エントリは、対応する列の値のリストです。ドキュメントはこちら: http://kdavies4.github.io/ModelicaRes/util.html#modelicares.util.load_csv。util.py ファイルには他にも多くの関数が含まれていますが、安全に削除することができます (一番上にある限りimport numpy as np)。

  4. 次のコードを実行して、平均距離を計算します。

    # Create counter dictionaries for the statistics.
    from collections import Counter
    n_runs = Counter()
    totals = Counter()
    
    # Calculate the total distance.
    for runner, distance in zip(d['Runner'], d['Distance']):
        n_runs[runner] += 1
        totals[runner] += distance
    
    # Print the results.
    for runner in set(d['Runner']):
        print("%s has run %i miles with an average of %g."
              % (runner, totals[runner], totals[runner]/float(n_runs[runner])))
    

これにより、必要な結果が得られ、データが (行または列によって) 拡張された場合に柔軟になるはずです。

ケビン

于 2013-06-08T03:18:00.840 に答える
1

あなたのループは次のように分割を使用します:

var1、var2、var3 = line.split(",")

これにより、各変数の行の各値が取得されます。次に、変数を好きなように使用します。

于 2013-03-14T02:39:55.190 に答える