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

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

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

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

Q&A

解決済

4回答

634閲覧

CSVファイルにおける特定の列群だけ取得したい

754x

総合スコア20

Python

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

0グッド

0クリップ

投稿2023/03/29 08:45

編集2023/03/29 09:04

実現したいこと

・条件を満たす列の抽出

前提

環境はJupyterLabで、pythonを使用しています

csvファイルに大量の列があり、各列名は"ID+α"であり、αは列ごとに異なります

列の中から特定のIDを名前に含んだ列だけを抽出したファイルを作成したいです

特定のIDとは4桁の数で、それらは配列で与えられています

Python

1#列名の例 2columns = "0001_A","0002_B","0003_C", ... ,"0027_AA", ... 3#特定のID群の例 4arr = ["0001","0002","0005","0012", ... ]

いくつかの方法を調べましたが、上記を容易に解決できる方法が思い浮かびませんでした

発生している問題・エラーメッセージ

皆さんのお力をお借りできれば幸いです
よろしくおねがいいたします

調査したこと・試したこと

列名の一部にIDが含まれているため、pandasのfilterでlikeを行おうとしましたが
likeは文字列でしか使えないため、配列ごとは適用できませんでした

また、列を一つずつ抜き出したファイルを作成し、条件に沿ったファイルだけを結合しようとしましたが
複数ファイルの読み込みかつキー結合が必要なため、pandasや、スクリプトでも難しく断念いたしました

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

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

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

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

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

guest

回答4

0

read_csv()usecolを使って、csvを読み込むときに列を絞りこむ方法もあります。
列名を引数にとって使いたい列に対してはTrueを返す関数を渡します。

python

1import pandas as pd 2from io import StringIO 3 4s = '''\ 50001_A,0002_B,0003_C,0004_D,0005_E 61,2,3,4,5 76,7,8,9,10 8''' 9 10arr = ['0001', '0004'] 11 12df = pd.read_csv(StringIO(s), usecols=lambda col: any(col.startswith(i) for i in arr)) 13 14print(df) 15# 0001_A 0004_D 16#0 1 4 17#1 6 9

投稿2023/03/29 10:28

bsdfan

総合スコア4560

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

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

0

pandasを使った例は出ているので、 csvを使ったやつを。

泥臭い感じで作ってますが、ポイントは
columns = [colname for colname in reader.fieldnames if colname.split('_')[0] in col_list]
こうやって、必要なカラムを抽出してるところですかね。

python

1import csv 2 3col_list = ["0001","0003","0012"] 4 5with open('test.csv', mode='r') as inf: 6 reader = csv.DictReader(inf) 7 columns = [colname for colname in reader.fieldnames if colname.split('_')[0] in col_list] 8 9 with open('outf.csv', mode='w', newline='') as outf: 10 writer = csv.DictWriter(outf, fieldnames=columns) 11 writer.writeheader() 12 for org_items in reader: 13 items = {col:val for col, val in org_items.items() if col in columns} 14 writer.writerow(items)```

投稿2023/03/29 09:57

TakaiY

総合スコア12763

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

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

754x

2023/04/06 06:49

回答ありがとうございます。 こちらの方でも確認したところ、無事動きました。 今回は最も回答時間が早い方をベストアンサーとさせていただきました。
guest

0

以下のような感じで欲しいID軍の列colsを抽出してやればよいと思います。

Python

1import pandas as pd 2 3df = pd.DataFrame([[1,2,3]], columns = ['0001_A','0002_B','0003_C']) 4print(df) 5# 0001_A 0002_B 0003_C 6#0 1 2 3 7 8#特定のID群の例 9arr = ['0001','0002','0005'] 10 11cols = list(filter(lambda c:list(filter(lambda s: s in c, arr)), df.columns)) 12ret = df[cols] 13print(ret) 14# 0001_A 0002_B 15#0 1 2

投稿2023/03/29 09:30

can110

総合スコア38262

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

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

754x

2023/04/06 06:49

回答ありがとうございます。 こちらの方でも確認したところ、無事動きました。 今回は最も回答時間が早い方をベストアンサーとさせていただきました。
guest

0

ベストアンサー

python

1import pandas as pd 2 3#列名の例 4columns = ["0001_A","0002_B","0003_C","0004_D","0005_E","0006_F", 5 "0007_G","0008_H","0009_I","0010_J","0011_K","0012_L"] 6#特定のID群の例 7arr = ["0001","0002","0005","0012"] 8 9# 10df = pd.DataFrame(data=[[*range(len(columns))]], columns=columns) 11dfx = df.filter(regex='|'.join(arr)) 12print(dfx) 13 14# 0001_A 0002_B 0005_E 0012_L 15# 0 0 1 4 11

投稿2023/03/29 09:17

melian

総合スコア19749

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

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

754x

2023/04/06 06:48

回答ありがとうございます。 こちらの方でも確認したところ、無事作動し、目的を達成できました。 最も回答時間が早かったためベストアンサーとさせていただきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問