アプリ版:「スタンプのみでお礼する」機能のリリースについて

ファイル '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)で賢くやりたいのですが、ご教授お願いします。

A 回答 (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で書いた方法です。
    • good
    • 0

そのfloatというのは、カラム1、2どちらのことでしょうか?



2の方なら、float関数を使うなどで、floatとして数値化するだけです。

1の方なら、floatに変換してもいいし、文字列のままでも構いません。
辞書型なので、整数以外にも添字として使えます。
むしろ、誤差のことまで考えたら、文字列のままの方がいいかもしれません。


has_keyについては、Python3をほとんど使ってないため失念していました。訂正します。

この回答への補足

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

補足日時:2013/06/01 19:56
    • good
    • 0

#1の回答で十分だと思いますが、一応書きます。



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

例えば、int('123')と書くところをfloat('1.23')と書けば良いだけでは?
http://docs.python.jp/2/library/functions.html#f …

あとは無駄にcsv.readerを使うと各行を読むのがちょっとは楽かもしれません。
http://docs.python.jp/2/library/csv.html#csv.rea …
for cols in csv.reader(open(filename), delimiter=' '):のような感じで。

表示する所ではdictionaryのitemsあたりを使うとよいでしょう。
http://docs.python.jp/2/library/stdtypes.html#di …


#1さんの回答に一つ突っ込むと、
has_keyは3.xで消えたのでinを使ったほうがよいかもしれません。
http://stackoverflow.com/questions/1323410/has-k …
    • good
    • 0

1カラム毎の値毎に集計をするなら、こんな感じ



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

この回答への補足

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

補足日時:2013/05/31 20:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!