• 締切済み

python で和の計算

ファイル 'a.dat'に、タブ区切りで、 1 333 1 444 1 555 1 888 2 444 2 555 2 666 3 777 3 888 ・ ・ ・ ・ ・ ・ という、第1カラムが重複しているファイルがあるとします。 やりたいことは、この第1カラムが重複している部分すべてに対して、例えば、 2 444 2 555 2 666 の第2カラムの総和を求めたいということです。 第1カラムが2だけでなく、3やそれ以降も重複している所があるので、その第1カラムが2の場合だけでなく、他の3などでも、例のように計算したいです。 プログラミング(python)で賢くやりたいのですが、ご教授お願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> これは、いちいち、カラム1やカラム2の値を手打ちで代入しないといけないのでしょうか。 ファイルa.datから1行読み込む方法はわかりますか? これがわからないなら、まずは、基礎を勉強してください。 http://www.python.jp/ に、日本語ドキュメントがあります。お使いのPythonのバージョンの「チュートリアル」を一通りやってください。 たとえば、1行目を変数sに読み込むと、次のような状態になります。 s="1\t 333\n" (\tがタブ,\nが改行です) a=s.split("\t") で、a=['1','333\n'] とリストになります。 a[0]がカラム1、a[1]がカラム2の文字列です。 こうするのが、#1の「2.入力行をカラムに分解する。」です。 他にも、正規表現を使うなど、分割方法はいくらでもあります。 泥くさい方法。 a.datをコピーして、a_dat.pyを作る。 a_dat.pyをテキストエディタで編集して、次のようにする。正規表現での置換機能があるエディタなら簡単にできる。 sum={} sum['1']+= 333 sum['1']+= 444 sum['1']+= 555 sum['1']+= 888 sum['2']+= 444 sum['2']+= 555 sum['2']+= 666 sum['3']+= 777 sum['3']+= 888 実行すると、sum['1']+= 333 でKeyErrorになるので、その前の行にsum['1']=0.0を挿入する。 実行すると、sum['2']+= 444 でKeyErrorになるので、その前の行にsum['2']=0.0を挿入する。 以下同様にKeyErrorrが発生したら、その前行にsum[XX]=0.0を挿入する、をKeyErrorが無くなるまで繰り返す。 最後に for k in sum.keys(): print k,sum[k] とでもすれば、集計結果が出力される。 これを自動でやらせようというのが、#1で書いた方法です。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

そのfloatというのは、カラム1、2どちらのことでしょうか? 2の方なら、float関数を使うなどで、floatとして数値化するだけです。 1の方なら、floatに変換してもいいし、文字列のままでも構いません。 辞書型なので、整数以外にも添字として使えます。 むしろ、誤差のことまで考えたら、文字列のままの方がいいかもしれません。 has_keyについては、Python3をほとんど使ってないため失念していました。訂正します。

leibniz1098
質問者

補足

これは、いちいち、カラム1やカラム2の値を手打ちで代入しないといけないのでしょうか。python初心者ですのでご教授お願いします。

回答No.2

#1の回答で十分だと思いますが、一応書きます。 > この例では、整数型になっていますが、実際は、float型です。なので、float型のやり方を教えてくださるとありがたいです。 例えば、int('123')と書くところをfloat('1.23')と書けば良いだけでは? http://docs.python.jp/2/library/functions.html#float あとは無駄にcsv.readerを使うと各行を読むのがちょっとは楽かもしれません。 http://docs.python.jp/2/library/csv.html#csv.reader for cols in csv.reader(open(filename), delimiter=' '):のような感じで。 表示する所ではdictionaryのitemsあたりを使うとよいでしょう。 http://docs.python.jp/2/library/stdtypes.html#dict.items #1さんの回答に一つ突っ込むと、 has_keyは3.xで消えたのでinを使ったほうがよいかもしれません。 http://stackoverflow.com/questions/1323410/has-key-or-in

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

1カラム毎の値毎に集計をするなら、こんな感じ 1.集計用に、辞書を用意する。(例: sum={} ) 2.入力行をカラムに分解する。 3.集計用辞書で「1カラム用」に「2カラム」の値を足す 例: sum[col1]+=col2 ※ sumにキーcol1が無いとエラーになるので、has_keyで存在を確認する。 存在しない場合は、sum[col1]=0等としてキーを追加する ※ col2は数値型に変換しておく 4.全入力行が終わるまで、2,3を繰り返す

leibniz1098
質問者

補足

この例では、整数型になっていますが、実際は、float型です。なので、float型のやり方を教えてくださるとありがたいです。

関連するQ&A