Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
@taki04
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A
Closed

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

解決したいこと

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

S__63283203.jpg

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

0
2
Answer

行を空白文字区切りでデータ化して、初列の数値が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
お忙しい中,回答ありがとうございます!
Anacondaのspyderでやっています!

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

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

NumPyには、テキストファイルを空白文字区切りで読み込む機能`loadtxt()`があります。
⇒ 公式ドキュメント
https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html
しつこくすみません!

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'
このようなエラーがでてしまいます!💦
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
これって順番を変えたりしないといけないですか??
私の回答本文の「実施例 3」をご覧ください。
(このコメントの前にある最初の部分が、本文です。)
すみません,追加した写真のようになってしまいます💦
「実施例 4」を追記いたしました。
お忙しい中,ありがとうございました!
無事解決しました!
しつこい質問に丁寧に答えていただき感謝してます!
ありがとうございました!!
無事に解決して良かったです。
「実施例 5」を追記いたしました。
既に終息しているところを、お騒がせして申し訳ございません。
わざわざ、わかりやすく何度もありがとうございます!!
ほんとに助かりました😢
ありがとうございました!
View the remaining 11 comments.

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
ありがとうございます!
解決できました!!
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login