ファイル '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件)
- 最新から表示
- 回答順に表示
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で書いた方法です。
No.3
- 回答日時:
そのfloatというのは、カラム1、2どちらのことでしょうか?
2の方なら、float関数を使うなどで、floatとして数値化するだけです。
1の方なら、floatに変換してもいいし、文字列のままでも構いません。
辞書型なので、整数以外にも添字として使えます。
むしろ、誤差のことまで考えたら、文字列のままの方がいいかもしれません。
has_keyについては、Python3をほとんど使ってないため失念していました。訂正します。
この回答への補足
これは、いちいち、カラム1やカラム2の値を手打ちで代入しないといけないのでしょうか。python初心者ですのでご教授お願いします。
補足日時:2013/06/01 19:56No.2
- 回答日時:
#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 …
No.1
- 回答日時:
1カラム毎の値毎に集計をするなら、こんな感じ
1.集計用に、辞書を用意する。(例: sum={} )
2.入力行をカラムに分解する。
3.集計用辞書で「1カラム用」に「2カラム」の値を足す
例: sum[col1]+=col2
※ sumにキーcol1が無いとエラーになるので、has_keyで存在を確認する。
存在しない場合は、sum[col1]=0等としてキーを追加する
※ col2は数値型に変換しておく
4.全入力行が終わるまで、2,3を繰り返す
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- その他(プログラミング・Web制作) google formsで回答者をスプレッドシートに記載する方法 1 2023/06/23 11:22
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- 化学 陰イオン交換クロマトグラフィーについての質問です。 先日、陰イオン錯体の形成による分離の実験を行いま 1 2023/05/02 01:26
- 化学 陰イオン交換クロマトグラフィーについて 陰イオン錯体の形成による分離の実験を行いました。 試料溶液中 1 2023/04/30 18:29
- MySQL SQLについて教えて下さい。 SELECT分で、あるカラムにある日付の 半年先のデータを取って来たい 3 2022/12/07 22:28
- MySQL SQLでカラムを追加し、条件に合致した場合にフラグ(レコード)を付与する方法 2 2022/05/18 23:54
- Excel(エクセル) エクセルのデータ整形について 3 2022/11/12 00:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLで特定の項目の重複のみを排...
-
COBOLについて
-
php mysql で WHERE句内に変数...
-
DataViewで複数条件の...
-
DataGridView 右詰め
-
バッチでcsvファイルの指定のカ...
-
リストビューの項目の内容を変...
-
【VBA】特定の文字列を含む場合...
-
fgetcsvでCSVを取得した際のnul...
-
C# リストビューの値を取得
-
PHPでDBからデータを抽出してHT...
-
ListViewのカラムの色の変更
-
google formsを使ったタスク依...
-
ListView
-
秀丸正規表現で数字を含まない...
-
WHERE句でのCASEについて
-
差し込み後、元データを変更し...
-
フィルターかけた後、重複を除...
-
エクセルで最後の文字だけ置き...
-
for whichの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLで特定の項目の重複のみを排...
-
バッチでcsvファイルの指定のカ...
-
COBOLについて
-
リストビューの項目の内容を変...
-
php mysql で WHERE句内に変数...
-
DataViewで複数条件の...
-
fgetcsvでCSVを取得した際のnul...
-
Zend_DBを使ったselectで文字が...
-
google formsを使ったタスク依...
-
初心者)DataGridViewの入力桁...
-
FormulaR1C1でSUMIF変数指定
-
DataGridView 右詰め
-
COBOL プログラミング
-
ListViewのカラムの色の変更
-
jQueryで、カラム幅を変更でき...
-
PHPでDBからデータを抽出してHT...
-
テキスト幅にあわせた表の作り...
-
VB6でActiveReport1.5Jを使って...
-
DataGridViewのデータをComboBo...
-
[WHS]定数宣言の際にリテラル文...
おすすめ情報