2017-03-17 22 views
1

私は非常にPythonで新しく、この1つでいくつかの助けが必要です。私はいろいろなコードを試してみましたが、うまくいきませんので、提案はすばらしいでしょう。フォルダ内の複数のcsvファイルを開き、列の平均をとって別のファイルに保存するにはどうすればいいですか?

私は、それぞれが複数のデータ列を含む約1500のcsvファイルを含むフォルダを持っています。私は "agr"と呼ばれる最初の列の平均を取って、この値を別のExcelまたはCSVファイルに保存する必要があります。ファイルの名前を保存して平均値を保存することができれば、ファイルがどのファイルから来たのかを把握することができれば嬉しいです。ファイルの名前はcrop_cityです(例:corn_omaha)。

import glob 
import csv 
import numpy as np 
import pandas as pd 


path = ('C:/test/*.csv') 

for fname in glob.glob(path): 
    with open(fname) as csvfile: 
     agr = [] 
     reader = csv.DictReader(fname) 
     print row['agr'] 

私は上記のコードは非常に初歩的なことを知っているので、任意の助けは偉大なおかげでみんなだろう!

+1

入力ファイルの例をいくつか追加して、出力をどのように表示することができますか?最初の列は10進数ですか?列間にはどのような区切り記号が使われますか – tdelaney

+0

入力ファイルはカンマ区切りファイル(csv)で、浮動小数点値です。 – Ben

答えて

0

、私はあなたが最初の列を追加しているという事実に依存することによって、あなたのコードを制限するために、あなたに助言しません。来週第3列で作業する必要がある場合はどうすればいいですか?あなたが提供するコードを基にして、これを適切に行うのは簡単です。何千ものテキストファイルを解析することは、あなたを遅らせるものではありません。

csv.DictReaderコンストラクタは、入力の最初の行をヘッダとして自動的に処理します(fieldnamesパラメータで列名のリストを明示的に指定しない限り)。だからあなたのコードは次のようになります。

import csv 
import glob 

averages = [] 
for fname in glob.glob(path): 
    with open(fname, "rb") as csvfile: 
     reader = csv.DictReader(csvfile) 
     values = [ float(row["agr"]) for row in reader ] 
     avg = sum(values)/len(values) 
     averages.append((fname, avg)) 

リストaveragesは今、あなたがしたい番号が含まれています。これは別のCSVファイルに書き出す方法です:

PS。あなたの輸入品にpandasを含めたので、パンダで同じことをする1つの方法があります。しかし、今のところはcsvとすることをお勧めします。 pandasオブジェクトモデルは複雑で、頭を包むのは難しいです。

averages = [] 
for fname in glob.glob(path): 
    data = pd.DataFrame.from_csv(fname) 
    averages.append((fname, data["agr"].mean())) 

df_out = pd.DataFrame.from_records(averages, columns=["File", "Average agr"]) 
df_out.to_csv("averages.csv", index=False) 

ファイルの入出力と計算は1つのステートメントで行うことができるので、コードはかなり短くなります。

+0

ありがとう! – Ben

+0

簡単な質問です。文字列を浮動小数点に変換する際にエラーが発生します。これは、csvファイルのヘッダーの最初の行を文字列から浮動小数点に変換しようとしていることを意味します。この? – Ben

+0

テストしないでください!いくつかの診断を印刷して、問題を引き起こしている行を見つけます。私の答えで書いたように、最初の行は列名として解釈されるので、それはできません。 'ValueError'は通常、浮動小数点に変換できない文字列を表示するので、最初の列の値が欠落している行があります。おそらく、それはcsvファイルの末尾にある空白行や余分な改行のようなものです。 – alexis

1

これらのCSVファイルの最初の列が10進数または浮動小数点数であると仮定すると、実際には行全体を解析する必要はありません。最初のセパレータで分割し、最初のトークンを解析します。 numpyまたはpandasには実質的な利点はありません。組み込みのsum機能を使用してください。 @tdelaneyによって答えに反し

import glob 
import os 

path = ('test/*.csv') # using local dir for test 
outfile.write("Filename,Sum\r\n") # header for output 
with open('output.csv', 'w', newline='') as outfile: 
    for fname in glob.glob(path): 
     with open(fname) as csvfile: 
      next(csvfile) # skip header 
      outfile.writelines("{},{}\r\n".format(os.path.basename(fname), 
       sum(float(line.split(',', 1)[0].strip()) 
       for line in csvfile))) 
+0

また、csv入力ファイルには文字列ヘッダーがあるため、異なる処理が必要な場合があります。 – Ben

+0

ヘッダー管理が更新されました。 – tdelaney

関連する問題