質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

3717閲覧

指定範囲ごとに平均値をとる

退会済みユーザー

退会済みユーザー

総合スコア0

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/11/08 01:10

(list) SER 1 N 1.00 67.95 0.6848 1.20 0.20 SER 1 CA 1.00 67.95 0.3678 2.21 1.13 SER 1 C 1.00 67.95 0.8392 2.35 0.86 SER 1 O 1.00 67.95 0.6812 2.98 1.96 SER 1 CB 1.00 67.95 0.7307 2.88 1.56 SER 1 OG 1.00 67.95 0.8069 2.88 2.68 GLU 2 N 1.00 236.11 0.7504 0.15 -1.25 GLU 2 CA 1.00 236.11 0.6495 0.20 -0.62 GLU 2 C 1.00 236.11 0.7734 1.63 0.25 GLU 2 O 1.00 236.11 0.6685 1.42 -0.03 GLU 2 CB 1.00 236.11 0.7334 0.20 -0.10 GLU 2 CG 1.00 236.11 -0.4950 0.99 0.66 GLU 2 CD 1.00 236.11 -0.1495 0.75 -0.10 GLU 2 OE1 1.00 236.11 0.1339 0.77 0.98 GLU 2 OE2 1.00 236.11 -0.4915 0.13 -0.01 LEU 3 N 1.00 237.00 0.7848 0.71 -0.56 LEU 3 CA 1.00 237.00 0.6279 1.69 0.56 LEU 3 C 1.00 237.00 0.1079 2.17 1.67 LEU 3 O 1.00 237.00 0.2808 1.67 0.38 LEU 3 CB 1.00 237.00 0.0994 1.36 0.16 LEU 3 CG 1.00 237.00 0.1195 -0.42 0.65 LEU 3 CD1 1.00 237.00 0.5806 0.10 0.20 LEU 3 CD2 1.00 237.00 0.2658 -0.25 0.95 ILE 4 N 1.00 138.13 0.1390 1.99 0.27 ILE 4 CA 1.00 138.13 0.0466 1.61 0.78 ILE 4 C 1.00 138.13 0.5692 -0.13 -0.44 ILE 4 CD1 1.00 138.13 0.1299 -0.30 -0.20

このようなファイルがあり、この1列目が同じもので6列目の平均値を出したいです。

例えば1~6行目(SER)で0.6848, 0.3678, 0.8392, 0.6812, 0.7307, 0.8069の平均値をだして出力するということをしたいです。

(得たい結果) SER 平均値の結果 GLY 平均値の結果 LEU 平均値の結果 ILE 平均値の結果

ファイルを2行目から別ファイルに書き出し、1列目が変わる行を抜き出すということをしたのですが、その先が分かりません。
また、そんなことをしなくてももっといい方法があればご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

pandasを使うのがお手軽かと。
参考:Python pandas でのグルーピング/集約/変換処理まとめ

Python

1import pandas as pd 2df = pd.read_csv('inp.csv',header=None,sep=' ',skipinitialspace=True) 3df.columns = ['c{}'.format(i+1) for i in range(len(df.columns))] 4#print(df.head()) 5 6# 1列目でグループ化して6列目の平均値を算出 7df2 = df.groupby('c1',sort=False)['c6'].mean() 8#print(df2) 9 10# 結果表示 11for row in df2.iteritems(): 12 print('{} {:.4f}'.format(row[0],row[1])) 13""" 14SER 0.6851 15GLU 0.2859 16LEU 0.3583 17ILE 0.2212 18"""

投稿2018/11/08 02:00

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/08 02:16

回答ありがとうございます。 実装して感動しました!
退会済みユーザー

退会済みユーザー

2018/11/08 02:18

ちなみに結果に2列目も加えたい場合、どうすればよいのか教えていただけませんか?
can110

2018/11/08 02:25

1列目と2列目が常に同じ(「SER 1~」「SER 2~」なデータはない)なら df2 = df.groupby(['c1','c2'],sort=False)['c6'].mean() でできます。 ただし出力部分のコードはちょっと修正する必要がありますが、難しくないのでご自身で考えてみてください。
退会済みユーザー

退会済みユーザー

2018/11/08 02:29

「SER 1~」「SER 2~」なデータがある場合はできないのでしょうか。
can110

2018/11/08 02:33

別行として(2行)集計されます。それでよければできます。 仮に同行(1行)として集計したいとしても SER 1~ SER 2~ を1列目だけで集計した結果の2列目は「1」「2」どちらを表示? ということです。
退会済みユーザー

退会済みユーザー

2018/11/08 02:39

何度もすみません。 別行として集計されるので結構なので、教えていただけませんか? SER 1~ SER 2~ を別物として平均をとりたいです。
can110

2018/11/08 02:42

実際に実行されてみましたか? df2 = df.groupby(['c1','c2'],~ でちゃんと別行として平均がとれます。
退会済みユーザー

退会済みユーザー

2018/11/08 02:43

実行したらうまくいきました! 確認不足で申し訳ありませんでした。 ありがとうございます。
can110

2018/11/08 02:44

うまくいってよかったです。
退会済みユーザー

退会済みユーザー

2018/11/08 02:53

print ('{} {} {:.4f}'.format(row[0],row[1],row[2])) と書き換えると IndexError: tuple index out of range となるのですが、こういうことではないのでしょうか?
can110

2018/11/08 02:59 編集

はい。ちょっと違います。まずは print(row) してみてデータの形を確認してみましょう。 タプルが2重になっているのが分かるかと思います
退会済みユーザー

退会済みユーザー

2018/11/08 03:07

print ('{} {} {:.4f}'.format(((row[0],row[1]),row[1]))) こういうことでしょうか? 度々すみません。
can110

2018/11/08 03:55

いえ。違います。 例えば「t = ((1,2),3)」で1,2,3それぞれprintするには どのようなコードを書けばよいか考えて&試行錯誤してみてください。 「print(t[0])」すると…
退会済みユーザー

退会済みユーザー

2018/11/08 06:39 編集

can110さんの期待した答えではないかもしれませんが、、、 for row in df2.iteritems(): average = ('{} {:.4f}'.format(row[0],row[1])) t = average[2:5] u = average[7:11] s = average[12:19] print t, u, s という風にスライスを使って出力しました。 いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問