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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

791閲覧

csv4つ以上の連番除外 python

Ruteshi

総合スコア32

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/09/24 06:48

前提・実現したいこと

下記の10行10列のcsvを読み込み行の数字を読み込んで4つ以上の連番含む行は除外して新たにcsvを作成したいです
data.csvを読み込み処理しdata1.csv の作成

連番を含む行は除外
ーー 例 ーー 
1,2,3,4,6,8,15,20,22,26    …除外(1,2,3,4)
4,6,8,15,16,20,25,35,40,44   …連番が4以下なので除外しない
5,8,10,11,12,13,17,20,22,25   …除外(10,11,12,13)
ーーーーーーーーーーーーーーーーーーーーーーー

data.csv
8,17,22,23,24,25,37,40,44,45
12,13,17,19,22,23,24,25,30,33
3,9,11,18,24,31,32,39,49,55
1,5,10,11,12,13,20,25,30,35
5,7,15,16,18,20,27,39,53,59
3,4,9,16,17,21,22,23,35,47
13,14,15,16,24,25,28,29,37,44
4,6,7,15,21,22,33,34,35,36
6,11,12,20,22,24,29,34,37,40
1,3,6,8,11,21,22,23,24,25

↓読み込み仕分けして削除それぞれ作成

連番が4個以上ある行を除外し以下のものだけ残したcsv作成

data1.csv
3,9,11,18,24,31,32,39,49,55
5,7,15,16,18,20,27,39,53,59
3,4,9,16,17,21,22,23,35,47
6,11,12,20,22,24,29,34,37,40

該当のソースコード

pythno

1import pandas as pd 2 3df = pd.read_csv('data.csv', header=None) 4 5#↓判断箇所 6df = 7 8 9df = df.drop(, axis=0) 10df.to_csv('data1.csv', header=None, index=None, encoding='utf_8_sig') 11 12 13 14

参考にさせて頂いたサイト

https://teratail.com/questions/132543

連番のcsvファイル(文字も含んでいる)の処理

https://blog.fantom.co.jp/2020/02/03/determine-if-a-file-is-a-sequential-number-first/

名前に現在時刻を入れたファイルが連番かどうか判定

判断させる所の考え方等
助言等戴けると幸いです

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

rollingを使えば連続する区間に対しての処理が簡単に書けます。

python

1import pandas as pd 2 3df = pd.read_csv('data.csv', header=None) 4 5# 判断箇所 6N = 4 7is_consecutive = ( 8 (df.diff(axis=1) == 1) # 隣との増分が1ならTrue (隣と連続) 9 .rolling(N - 1, axis=1).apply(all) # N-1続けてTrueならTrue (N個続けて連続) 10 .any(axis=1, skipna=True) # 行に一つでもTrueがあればTrue 11) 12 13# N個連続がある行以外を選択 14df = df[~is_consecutive] 15df.to_csv('data1.csv', header=None, index=None, encoding='utf_8_sig')

投稿2020/09/25 00:43

bsdfan

総合スコア4794

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

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

0

python

1import io 2import numpy as np 3from scipy import ndimage 4 5data = """ 68,17,22,23,24,25,37,40,44,45 712,13,17,19,22,23,24,25,30,33 83,9,11,18,24,31,32,39,49,55 91,5,10,11,12,13,20,25,30,35 105,7,15,16,18,20,27,39,53,59 113,4,9,16,17,21,22,23,35,47 1213,14,15,16,24,25,28,29,37,44 134,6,7,15,21,22,33,34,35,36 146,11,12,20,22,24,29,34,37,40 151,3,6,8,11,21,22,23,24,25""" 16 17arr = np.genfromtxt(io.StringIO(data), delimiter=',') 18# array([[ 8, 17, 22, 23, 24, 25, 37, 40, 44, 45], 19# [12, 13, 17, 19, 22, 23, 24, 25, 30, 33], 20# [ 3, 9, 11, 18, 24, 31, 32, 39, 49, 55], 21# [ 1, 5, 10, 11, 12, 13, 20, 25, 30, 35], 22# [ 5, 7, 15, 16, 18, 20, 27, 39, 53, 59], 23# [ 3, 4, 9, 16, 17, 21, 22, 23, 35, 47], 24# [13, 14, 15, 16, 24, 25, 28, 29, 37, 44], 25# [ 4, 6, 7, 15, 21, 22, 33, 34, 35, 36], 26# [ 6, 11, 12, 20, 22, 24, 29, 34, 37, 40], 27# [ 1, 3, 6, 8, 11, 21, 22, 23, 24, 25]]) 28 29# その1 30idx = np.all(np.convolve(np.ediff1d(arr.ravel()) == 1, np.array([1, 1, 1]))[:-1].reshape(arr.shape)[:, 2:-1] != 3, 1) 31# その2 32idx = np.all(ndimage.convolve((np.diff(arr) == 1).view(np.int8), np.array([[1, 1, 1]])) != 3, 1) 33 34arr[idx] 35# array([[ 3, 9, 11, 18, 24, 31, 32, 39, 49, 55], 36# [ 5, 7, 15, 16, 18, 20, 27, 39, 53, 59], 37# [ 3, 4, 9, 16, 17, 21, 22, 23, 35, 47], 38# [ 6, 11, 12, 20, 22, 24, 29, 34, 37, 40]])

解説

工程1

まず、np.diff()あるいはnp.ediff1d()を用いて、隣との差を計算します。np.ediff1d()を用いる場合は、事前にarrを一次元配列にします。

python

1a = np.diff(arr) 2# array([[ 9, 5, 1, 1, 1, 12, 3, 4, 1], 3# [ 1, 4, 2, 3, 1, 1, 1, 5, 3], 4# [ 6, 2, 7, 6, 7, 1, 7, 10, 6], 5# [ 4, 5, 1, 1, 1, 7, 5, 5, 5], 6# [ 2, 8, 1, 2, 2, 7, 12, 14, 6], 7# [ 1, 5, 7, 1, 4, 1, 1, 12, 12], 8# [ 1, 1, 1, 8, 1, 3, 1, 8, 7], 9# [ 2, 1, 8, 6, 1, 11, 1, 1, 1], 10# [ 5, 1, 8, 2, 2, 5, 5, 3, 3], 11# [ 2, 3, 2, 3, 10, 1, 1, 1, 1]]) 12 13a1D = np.ediff1d(arr.ravel()) 14# array([ 9, 5, 1, 1, 1, 12, 3, 4, 1, -33, 1, 4, 2, 15# 3, 1, 1, 1, 5, 3, -30, 6, 2, 7, 6, 7, 1, 16# 7, 10, 6, -54, 4, 5, 1, 1, 1, 7, 5, 5, 5, 17# -30, 2, 8, 1, 2, 2, 7, 12, 14, 6, -56, 1, 5, 18# 7, 1, 4, 1, 1, 12, 12, -34, 1, 1, 1, 8, 1, 19# 3, 1, 8, 7, -40, 2, 1, 8, 6, 1, 11, 1, 1, 20# 1, -30, 5, 1, 8, 2, 2, 5, 5, 3, 3, -39, 2, 21# 3, 2, 3, 10, 1, 1, 1, 1])

工程2

続いて、得た配列を1と比較することで、連番になっている部分を取得します。(.view(np.int8)は、True/Falseの配列を1/0にするために用いています)

python

1b = (a == 1).view(np.int8) 2# array([[0, 0, 1, 1, 1, 0, 0, 0, 1], 3# [1, 0, 0, 0, 1, 1, 1, 0, 0], 4# [0, 0, 0, 0, 0, 1, 0, 0, 0], 5# [0, 0, 1, 1, 1, 0, 0, 0, 0], 6# [0, 0, 1, 0, 0, 0, 0, 0, 0], 7# [1, 0, 0, 1, 0, 1, 1, 0, 0], 8# [1, 1, 1, 0, 1, 0, 1, 0, 0], 9# [0, 1, 0, 0, 1, 0, 1, 1, 1], 10# [0, 1, 0, 0, 0, 0, 0, 0, 0], 11# [0, 0, 0, 0, 0, 1, 1, 1, 1]], dtype=int8) 12 13b1D = a1D == 1 14# array([False, False, True, True, True, False, False, False, True, 15# False, True, False, False, False, True, True, True, False, 16# False, False, False, False, False, False, False, True, False, 17# False, False, False, False, False, True, True, True, False, 18# False, False, False, False, False, False, True, False, False, 19# False, False, False, False, False, True, False, False, True, 20# False, True, True, False, False, False, True, True, True, 21# False, True, False, True, False, False, False, False, True, 22# False, False, True, False, True, True, True, False, False, 23# True, False, False, False, False, False, False, False, False, 24# False, False, False, False, False, True, True, True, True])

上記の配列で1が3連続する箇所は、連番が4つ続いているということです。

工程3

畳み込み演算(np.convolve()またはscipy.ndimage.convolve())を利用して、1が3連続する箇所を探し出します。なおnp.convolve()は一次元配列同士でしか計算できませんので、計算後に形を整える必要があります。

python

1c = ndimage.convolve(b, np.array([[1, 1, 1]])) 2# array([[0, 1, 2, 3, 2, 1, 0, 1, 2], 3# [2, 1, 0, 1, 2, 3, 2, 1, 0], 4# [0, 0, 0, 0, 1, 1, 1, 0, 0], 5# [0, 1, 2, 3, 2, 1, 0, 0, 0], 6# [0, 1, 1, 1, 0, 0, 0, 0, 0], 7# [2, 1, 1, 1, 2, 2, 2, 1, 0], 8# [3, 3, 2, 2, 1, 2, 1, 1, 0], 9# [1, 1, 1, 1, 1, 2, 2, 3, 3], 10# [1, 1, 1, 0, 0, 0, 0, 0, 0], 11# [0, 0, 0, 0, 1, 2, 3, 3, 3]], dtype=int8) 12 13c1D = np.convolve(b1D, np.array([1, 1, 1]))[:-1].reshape(arr.shape)[:, 2:-1] 14# array([[1, 2, 3, 2, 1, 0, 1], 15# [1, 0, 1, 2, 3, 2, 1], 16# [0, 0, 0, 1, 1, 1, 0], 17# [1, 2, 3, 2, 1, 0, 0], 18# [1, 1, 1, 0, 0, 0, 0], 19# [1, 1, 1, 2, 2, 2, 1], 20# [3, 2, 2, 1, 2, 1, 1], 21# [1, 1, 1, 1, 2, 2, 3], 22# [1, 1, 0, 0, 0, 0, 0], 23# [0, 0, 0, 1, 2, 3, 3]])

上記の配列で3がある箇所は、連番が4つ続いているということです。

工程4

取得した配列に3が含まれる行を除外するので、求めるidxは、

python

1idx = np.all(c != 3, 1) 2# array([False, False, True, False, True, True, False, False, True, False]) 3 4idx = np.all(c1D != 3, 1) 5# array([False, False, True, False, True, True, False, False, True, False])

投稿2020/09/25 01:18

編集2020/09/29 02:10
kirara0048

総合スコア1399

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

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

bsdfan

2020/09/28 01:46

1次元化してnp.convolve()を使う方法ですが、これだと行をまたいで連続になるケースで誤判定しないでしょうか? [2:]の部分が[2:-1]か[1:-1]な気がします。
kirara0048

2020/09/29 02:08

[2:-1]が正しいですね、ありがとうございます。修正しました。
guest

0

ベストアンサー

  • 連番=手前の数値との差分が1
  • 4連続=差分が1が3連続する

なので、以下のような判定でいけそうです。
参考:Python/Pandas】連続値の個数をカウント

Python

1import pandas as pd 2from io import StringIO 3 4s = """ 58,17,22,23,24,25,37,40,44,45 612,13,17,19,22,23,24,25,30,33 73,9,11,18,24,31,32,39,49,55 81,5,10,11,12,13,20,25,30,35 95,7,15,16,18,20,27,39,53,59 103,4,9,16,17,21,22,23,35,47 1113,14,15,16,24,25,28,29,37,44 124,6,7,15,21,22,33,34,35,36 136,11,12,20,22,24,29,34,37,40 141,3,6,8,11,21,22,23,24,25""" 15df = pd.read_csv(StringIO(s), header=None) 16 17# 差分が1が4連続するか 18def is_four(ser): 19 # 差分が1かの真偽結果を得る 20 s1 = ser.diff().fillna(0).astype(int) == 1 21 # 真または偽が連続する累積数を求める 22 s2 = s1.groupby((s1 != s1.shift()).cumsum()).cumcount() + 1 23 # 真が3連続以上 24 return (s1 & (s2 >= 3)).any() 25 26ret = df.apply(is_four, axis=1) 27df = df[~ret] # 条件に一致した行を除外 28print(df) 29# 0 1 2 3 4 5 6 7 8 9 30#2 3 9 11 18 24 31 32 39 49 55 31#4 5 7 15 16 18 20 27 39 53 59 32#5 3 4 9 16 17 21 22 23 35 47 33#8 6 11 12 20 22 24 29 34 37 40

投稿2020/09/24 08:05

編集2020/09/24 08:07
can110

総合スコア38341

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問