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

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

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

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

Q&A

解決済

1回答

3725閲覧

文字列を判定し、前行と比較して値を変更する

退会済みユーザー

退会済みユーザー

総合スコア0

Python 2.7

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

0グッド

0クリップ

投稿2018/10/24 07:49

編集2018/10/25 00:56
(file1) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 10   # 1列めの文字列は同じだが、3列めの数字が2以上増えている。 GLY B 10 GLY B 10 GLY B 10 TRP B 11     TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 13 ILE B 13
(file2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 4 GLY B 4 GLY B 4 GLY B 4 TRP B 5 TRP B 5 TRP B 5 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 7 ILE B 7

file1をfile2のように書き換えたいです。

具体的には
・3列めの数字が前の行より2以上増えているとき、(その前の行の3列めの数+1)に変更する。
・1列めの文字列が同じ行では3列めの数字を同じにする。
ただし、file1で1列めの文字列が同じでも、3列めの数字が2以上増えているとき、(その前の行の3列めの数+1)に変更する。

file1を2行目から読み込んだfile1_2を作成し、1行ずつ比較していたのですが、3列目の数字を変えても、その次の行の数字を前行に揃えることができず、このやり方では無理と判断しました。

python

1path = 'file1' 2 3with open(path) as f: #file1の2行目からを取り出したfile1_2を作成 4 next(f) 5 for line in f: 6 fileobj = open("file1_2","a") 7 print >> fileobj, line.rstrip() 8 9path = 'file1' 10path2 = 'file1_2' 11f = open(path).readlines() 12f2 = open(path2).readlines() 13 14for (line, line2) in zip(f, f2): 15 line_res = line[0:3] 16 line_num = line[7:9] 17 line2_res = line2[0:3] 18 line2_num = line2[7:9] 19 if (line_res == line2_res) and (line_num == line2_num):   20 #file1とfile1_2の1列目と3列目が同じならば、file1をそのまま出力 21 fileobj = open("file2","a") 22 print >> fileobj, line.rstrip() 23 elif (line_res != line2_res) and ((int(line_num) + 1) == (int(line2_num))): 24 #file1とfile1_2の1列目が違うかつ3列目が1増えているならば、file1をそのまま出力 25 fileobj = open("file2","a") 26 print >> fileobj, line.rstrip() 27 elif (line_res != line2_res) and ((int(line_num) + 1) != (int(line2_num))):   28 #file1とfile1_2の1列目が違うかつ3列目が2以上増えているとき、3列目をfile1の3列目の数字+1にして出力 29 line_num_1 = ((int(line_num)) + 1) 30 line_num_2 = (str(line_num_1)).rjust(1) 31 tmp = line[:30] + line_num_2 + line[33:] 32 fileobj = open("file2","a") 33 print >> fileobj, tmp.rstrip() 34
(file1)       (file1_2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 10 GLY B 10 GLY B 10   GLY B 10 GLY B 10 GLY B 10 GLY B 10 GLY B 10 TRP B 11 TRP B 11 TRP B 11     TRP B 11 TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 13 ILE B 13 ILE B 13 ILE B 13

しかし、この方法では

(file2) PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 PRO B 2 GLY B 3 GLY B 3 GLY B 3 GLY B 3 GLY B 4 GLY B 10 GLY B 10 GLY B 10 TRP B 11     TRP B 11 TRP B 11 LEU B 6 LEU B 6 LEU B 6 LEU B 6 ILE B 7 ILE B 13

となってしまいます。
前の行の変更を反映して次の行に移るようにするにはどうすればよいのでしょうか。
それとも他にやりようがあるのでしょうか。

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

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

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

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

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

dice142

2018/10/24 10:42

コードをご提示ください。
退会済みユーザー

退会済みユーザー

2018/10/25 01:33

追加しました。ご確認お願いします。
guest

回答1

0

ベストアンサー

pandas 使って行うと良いのではないでしょうか。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.read_csv('file1', header=None, sep=' ', skipinitialspace=True) 5df[2] = df[2].astype('int') 6df[2] = (df[2].diff() != 0).cumsum() + df.iloc[0,2] - 1 7print(df) 8np.savetxt('file2', df.values, fmt='%s %s %3d')

投稿2018/10/24 11:08

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2018/10/25 06:32

回答ありがとうございます! 数字は期待通りに変更されました。 しかし、pandasで処理してしまうと、列間の空白が変わってしまうので、そこが問題となっています。
退会済みユーザー

退会済みユーザー

2018/10/25 07:12

なんとかなりそうです。 ありがとうございます。
magichan

2018/10/25 07:13

どもです。 一応、新しい質問の方に回等をしておきました。(期待した答えではないかと思いますが)
magichan

2018/10/25 07:14

おっ、コメントが入れ違いになってしまいました
退会済みユーザー

退会済みユーザー

2018/10/25 07:58

ちなみに、np.savetxtで列をタブ区切りはできないのでしょうか。 np.savetxt('file2', df.values, delimiter="\t", fmt='%s %s %3d') としても、区切りが空白一つのままになっています。
magichan

2018/10/25 08:03

その場合は fmt側にて指定します。TABは'\t'ですので np.savetxt('file2', df.values, fmt='%s\t%s\t%3d') でしょうか
退会済みユーザー

退会済みユーザー

2018/10/25 08:05

できました! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問