LoginSignup
taki04
@taki04 (海希 柊)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

特定の行を消してたいです💦

解決したいこと

5523行ごとに出てくる行を消したいです!
5522ステップ分あるデータの名前としてあるのですが,
計算上不要なので消したいです!
写真にあるような不要な行が,5523行目ごとに計1000個分あります!
これを消す方法を助言して頂けたら,幸いです!
お忙しい中,すみませんがよろしくお願いします!💦

S__63283203.jpg

S__63307778.jpg
S__63307780.jpg
 
このようになります💦

0

2Answer

行を空白文字区切りでデータ化して、初列の数値が5522以下の行だけ残せば良いのではないでしょうか?
コードを見せていただければ、より詳しいお話ができると思います。

実施例 1 (pandas)
code
import pandas as pd

data = pd.DataFrame({'key':[5520, 5521, 5522, 29860000, 1, 2, 3, 4, 5], 'a':[1,2,3,5522,1,2,3,4,5], 'b':[300, 300, 200, 1956, 250, 200, 200, 250, 300]})
print(f"元\n{data}\n")

data = data[data['key'] <= 5522]
print(f"新\n{data}")```
result
元
        key     a     b
0      5520     1   300
1      5521     2   300
2      5522     3   200
3  29860000  5522  1956
4         1     1   250
5         2     2   200
6         3     3   200
7         4     4   250
8         5     5   300

新
    key  a    b
0  5520  1  300
1  5521  2  300
2  5522  3  200
4     1  1  250
5     2  2  200
6     3  3  200
7     4  4  250
8     5  5  300
実施例 2 (NumPy)
code
import numpy as np

data = np.array([
    [    5520,    1,  300],
    [    5521,    2,  300],
    [    5522,    3,  200],
    [29860000, 5522, 1956],
    [       1,    1,  250],
    [       2,    2,  200],
    [       3,    3,  200],
    [       4,    4,  250],
    [       5,    5,  300],
    ])
print(f"元\n{data}\n")

data = np.delete(data, np.where(data > 5522)[0], axis=0)
print(f"新\n{data}")
result
元
[[    5520        1      300]
 [    5521        2      300]
 [    5522        3      200]
 [29860000     5522     1956]
 [       1        1      250]
 [       2        2      200]
 [       3        3      200]
 [       4        4      250]
 [       5        5      300]]

新
[[5520    1  300]
 [5521    2  300]
 [5522    3  200]
 [   1    1  250]
 [   2    2  200]
 [   3    3  200]
 [   4    4  250]
 [   5    5  300]]
実施例 3 (NumPy、ファイルの読み込みから)
code
import numpy as np

data = np.loadtxt('rv5')
print(f"元\n{data}\n")

data = np.delete(data, np.where(data > 5522)[0], axis=0)
print(f"新\n{data}")
rv5
 5520 1 300
 5521 2 300
 5522 3 200
29860000 5522 1956
 1 1 250
 2 2 200
 3 3 200
 4 4 250
 5 5 300
result
元
[[5.520e+03 1.000e+00 3.000e+02]
 [5.521e+03 2.000e+00 3.000e+02]
 [5.522e+03 3.000e+00 2.000e+02]
 [2.986e+07 5.522e+03 1.956e+03]
 [1.000e+00 1.000e+00 2.500e+02]
 [2.000e+00 2.000e+00 2.000e+02]
 [3.000e+00 3.000e+00 2.000e+02]
 [4.000e+00 4.000e+00 2.500e+02]
 [5.000e+00 5.000e+00 3.000e+02]]

新
[[5.520e+03 1.000e+00 3.000e+02]
 [5.521e+03 2.000e+00 3.000e+02]
 [5.522e+03 3.000e+00 2.000e+02]
 [1.000e+00 1.000e+00 2.500e+02]
 [2.000e+00 2.000e+00 2.000e+02]
 [3.000e+00 3.000e+00 2.000e+02]
 [4.000e+00 4.000e+00 2.500e+02]
 [5.000e+00 5.000e+00 3.000e+02]]
実施例 4 (NumPy、ファイルの読み込みから、行毎に列数が異なる場合)

loadtxtは、列数が揃っていないと使えないようです。

《冗長でしたので削除しました》

実施例 5 (NumPy、ファイルの読み込みから、行毎に列数が異なる場合)

もっと単純に書けました。

code
import numpy as np

# 空白文字区切りで列数が3より大きい行だけをfloat配列へ読み込む
file = open('rv5')
data = [x for x in map(lambda x: list(map(float, x.strip().split(' '))), file) if len(x) > 3]
file.close()

# NumPy化
data = np.array(data)
print(data")
rv5
 5520 1 300 1
 5521 2 300 2
 5522 3 200 3
29860000 5522 1956
 1 1 250 4
 2 2 200 5
 3 3 200 6
 4 4 250 7
 5 5 300 8
result
[[5.520e+03 1.000e+00 3.000e+02 1.000e+00]
 [5.521e+03 2.000e+00 3.000e+02 2.000e+00]
 [5.522e+03 3.000e+00 2.000e+02 3.000e+00]
 [1.000e+00 1.000e+00 2.500e+02 4.000e+00]
 [2.000e+00 2.000e+00 2.000e+02 5.000e+00]
 [3.000e+00 3.000e+00 2.000e+02 6.000e+00]
 [4.000e+00 4.000e+00 2.500e+02 7.000e+00]
 [5.000e+00 5.000e+00 3.000e+02 8.000e+00]]
0

Comments

  1. @taki04

    Questioner
    お忙しい中,回答ありがとうございます!
    Anacondaのspyderでやっています!

    import numpy as np
    f=open('rv5')
    line=f.readline()
    item=line.split()
    item2=np.delete(item,5523,0)

    今はこのような形で入力したのですが,エラーがでました!
  2. NumPyの場合の実施例を追記しました。
  3. @taki04

    Questioner
    しつこくすみません!

    import numpy as np

    nZ=251
    nR=22
    Nd=1000

    dat=np.empty([Nd,nR,nZ])
    for i in range(Nd):
    for j in range(nR):
    for k in range(nZ):

    line=f.readline()
    item=line.split()
    int(item[0])
    data=np.delete(item,np.where(item>5523)[0], axis=0)
    print(data)

    TypeError: '>' not supported between instances of 'list' and 'int'
    このようなエラーがでてしまいます!💦
  4. @taki04

    Questioner
    import numpy as np
    nZ=251
    nR=22
    Nd=1000

    f=open('rv5')

    dat=np.empty([Nd,nR,nZ])
    for i in range(Nd):
    for j in range(nR):
    for k in range(nZ):

    line=np.loadtxt('rv5')
    item=line.split()

    int(item[0])
    data=np.delete(item,np.where(item>5523)[0], axis=0)
    print(data)

    ValueError: Wrong number of columns at line 5523
    これって順番を変えたりしないといけないですか??
  5. 私の回答本文の「実施例 3」をご覧ください。
    (このコメントの前にある最初の部分が、本文です。)
  6. @taki04

    Questioner
    すみません,追加した写真のようになってしまいます💦
  7. 「実施例 4」を追記いたしました。
  8. @taki04

    Questioner
    お忙しい中,ありがとうございました!
    無事解決しました!
    しつこい質問に丁寧に答えていただき感謝してます!
    ありがとうございました!!
  9. 無事に解決して良かったです。
  10. 「実施例 5」を追記いたしました。
    既に終息しているところを、お騒がせして申し訳ございません。
  11. @taki04

    Questioner
    わざわざ、わかりやすく何度もありがとうございます!!
    ほんとに助かりました😢
    ありがとうございました!

Pandasで読み込んでからなんとかするのではなく、データを別のスクリプトで前処理する方法はどうでしょうか。見たところ

  • 必要な行は先頭がスペースから始まる
  • 不要な行は先頭が数値から始まる

ようなので、

extract.py
def extract(source_file_name, dest_file_name):
    with open(source_file_name, mode="r") as source:
        with open(dest_file_name, mode="w") as dest:
           for line in source:
               if line != "" and line[0] == " ":
                   dest.write(line)

のように簡単に書けそうです。

WindowsならPowerShellを使う手もありますがとっつきにくいと思うのでやめます。Linux(WSL)ならgrepコマンドで一発ですね。

$ grep -E "^ " source.txt > dest.txt
0

Comments

  1. @taki04

    Questioner
    ありがとうございます!
    解決できました!!

Your answer might help someone💌