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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

859閲覧

Python3 Tkinter リストからデータを抽出したい

person

総合スコア224

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/29 07:57

編集2020/10/29 08:45

"データ種別_連番.csv"
という形式のファイル名のファイルがあります。リストに入っています。

基本的にはこれを別のリストに入れます。
ただしデータ種別が同じものが複数あるので、
その場合は連番の値が大きい方だけを取得したいです。

Python

1# 元のデータ 2files = [ 3 "A0_01.csv", # <--- データ種別A0が複数あり、連番の値が低いのでいらない 4 "A1_01.csv", # <--- データ種別A1は1つだけなのでいる 5 "A0_02.csv", # <--- データ種別A0が複数あり、連番の値が高いのでいる 6 "A2_03.csv", # <--- データ種別A2は1つだけなのでいる 7 "A15_04.csv", # <--- データ種別A15は1つだけなのでいる 8 "A7_05.csv" # <--- データ種別A7は1つだけなのでいる 9]

Python

1# 元のデータから抽出したいデータ 2files = [ 3 "A1_01.csv", 4 "A0_02.csv", 5 "A2_03.csv", 6 "A15_04.csv", 7 "A7_05.csv" 8]

そこで、2次元配列にデータ種別と連番を入れて、最新のデータか比較を行えるようにする。
比較した後で、ファイル名のリストと照らし合わせて、不要なやつを消すようにしようと考えました。
(他に効率のいい方法があれば教えて下さい。)

というわけで下のようにソースコードを作ったのですが、
----- リストの要素抽出処理 ----- という部分でうまくいきません。
(考え方からおかしいかもしれませんが)

Python

1 2def func(files): 3 4 li = [] 5 6 for file in files: 7 tmp = file.split("_") 8 datakind = tmp[0] 9 commaindex = tmp[1].index(".") 10 num = tmp[1][:commaindex] 11 li.append([datakind, num]) 12 13 # print(li) 14 # [['A0', '01'], ['A1', '01'], ['A0', '02'], ['A2', '03'], ['A15', '04']] 15 16 # ----- リストの要素抽出処理 ----- 17 # イメージ:li[i][0]とli[j][0]を比較して一致したら、li[i][1]とli[j][1]の最新の方を戻り値用のリストに入れるみたいな感じ 18 19 # これだと失敗 20 #for i in range(len(li)-1): 21 # for j in range(i+1, len(li)-1): 22 #省略 23 24 25 # ----- ファイル群の中から必要なやつだけ抽出 ----- 26 27 #return 28 29 30# ファイル群 31# データ種別に規則性はない 32# 下の例の場合A0は複数あるので、連番の値が大きいA0_02.csvを取りたい 33files = [ 34 "A0_01.csv", 35 "A1_01.csv", 36 "A0_02.csv", 37 "A2_03.csv", 38 "A15_04.csv", 39] 40 41 42ret = func(files)

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

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

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

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

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

guest

回答1

0

ベストアンサー

元のリストの並びが変わってよければソートした後に最大連番の行のみを抽出するとよいです。

Python

1import pandas as pd 2 3files = [ 4 "A0_01.csv", # <--- データ種別A0が複数あり、連番の値が低いのでいらない 5 "A1_01.csv", # <--- データ種別A1は1つだけなのでいる 6 "A0_02.csv", # <--- データ種別A0が複数あり、連番の値が高いのでいる 7 "A2_03.csv", # <--- データ種別A2は1つだけなのでいる 8 "A15_04.csv", # <--- データ種別A15は1つだけなのでいる 9 "A7_05.csv" # <--- データ種別A7は1つだけなのでいる 10] 11df = pd.DataFrame({'file':sorted(files)}) 12 13# データ種別が重複する行を削除。残すのは末尾 14df['type'] = df['file'].apply(lambda v:v[:v.find('_')]) 15df = df.drop_duplicates(subset='type',keep='last') 16ret = df['file'].tolist() 17 18print(ret) # 'A0_02.csv', 'A15_04.csv', 'A1_01.csv', 'A2_03.csv', 'A7_05.csv']

投稿2020/10/29 08:28

can110

総合スコア38341

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

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

person

2020/10/29 11:58

回答ありがとうございます。 pandasを今まで使ったことがないのですが、 どういう処理をしているか説明してもらってもいいですか? df = pd.DataFrame({'file':sorted(files)}) でfileという名前を付けてソートしているのまでは分かったのですが・・・
can110

2020/10/30 06:40

.applyにて「A01」部分を抽出してtype列に入れています。 .drop_duplicatesにてtypeが重複した行を削除しています。 その際keep=lastで最大連番の行のみ残すようにしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問