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

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

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

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

Python 3.x

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

Q&A

2回答

1123閲覧

CSVファイルから文字列を抽出・格納したい

Male_soprano

総合スコア10

CSV

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

Python 3.x

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

0グッド

1クリップ

投稿2020/11/09 07:20

編集2020/11/09 07:40

前提・実現したいこと

Test3.csvのうちV2列の2行目以降全ての文字列において.11-15番目,51-60番目の文字列を抽出して新たな列に格納すると同時に,"-"が登場した際にそれを削除するようなコードを書きたいと考えています.
お知恵をお貸し頂けますと幸いです.宜しくお願い致します.
尚,こちらは本データ(1000行以上)を簡略化したものです.

該当のソースコード

python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import pandas as pd 4 5slice_range1 = slice(11, 15) 6slice_range2= slice(51, 60) 7input_path = "Test3.csv" 8output_path = "separated.csv" 9 10with open(input_path) as f: 11 element = f.read() 12 13with open(output_path, "w") as g: 14 for index, row in element.iterrows(): 15 csv_input['Part1'][index] = slice_range1 16 csv_input['Part2'][index] = slice_range2 17 18# 文字列の途中の改行を消す 19text = re.sub(r"-", "", text) 20 21csv_input.to_csv(g, index=False)

現実の出力結果

separated.csv

1Entry,V2,Part1,Part2 2A0K7T1,----MSNKGQL-LQDPFLNALRKEHVPVSIYLVNGIKLQGNIESFDQYVVL-------LR,"slice(11, 15, None)","slice(51, 60, None)" 3A0KGS1,-----MAKGQS-LQDPFLNALRRERIPVSIYLVNGIKLQGQIESFDQFVIL-------LK,"slice(11, 15, None)","slice(51, 60, None)" 4A0KSR7,-----MAKGQS-LQDPFLNALRRERVPVSIYLVNGIKLQGQVESFDQFVIL-------LK,"slice(11, 15, None)","slice(51, 60, None)" 5A0Q0M9,-----MNKSTNNLQDLFLNNARINRISVTIFLTNGYKLEGLVKGFDNFTII-------LD,"slice(11, 15, None)","slice(51, 60, None)" 6A0Q6S3,-----MSRISS-LQDPFLNALRKEKVSVSVYLVNGIKLQGQVEAFDQFCIV-------LR,"slice(11, 15, None)","slice(51, 60, None)"

理想の出力結果

output.csv

1Entry,V2,Part1,Part2 2A0K7T1,LLQD,LLR 3A0KGS1,SLQD,LLK 4A0KSR7,SLQD,LLK 5A0Q0M9,NNLQD,ILD 6A0Q6S3,SLQD,VLR

使用ファイル

Test3.csv

1Entry,V2 2A0K7T1,----MSNKGQL-LQDPFLNALRKEHVPVSIYLVNGIKLQGNIESFDQYVVL-------LR 3A0KGS1,-----MAKGQS-LQDPFLNALRRERIPVSIYLVNGIKLQGQIESFDQFVIL-------LK 4A0KSR7,-----MAKGQS-LQDPFLNALRRERVPVSIYLVNGIKLQGQVESFDQFVIL-------LK 5A0Q0M9,-----MNKSTNNLQDLFLNNARINRISVTIFLTNGYKLEGLVKGFDNFTII-------LD 6A0Q6S3,-----MSRISS-LQDPFLNALRKEKVSVSVYLVNGIKLQGQVEAFDQFCIV-------LR

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

macOS10.15.4 Python3.7.3 Atom

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

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

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

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

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

can110

2020/11/09 07:37 編集

使用ファイルと理想の出力結果は正しく対応しているでしょうか? 結果の2行2列目の「LLQD」や3列目「VLLR」がどのような規則で抽出されたのか より詳しく具体的に記載ください。
Male_soprano

2020/11/09 07:44

説明が足りず失礼しました. 例えば2行目2列のうち11-15番目の文字列"L-LQD"ですが,こちらのうち"-"を削除した結果が「LLQD」になります. 同様に,51-60番目の文字列"L-------LR"も「LLR」となります.(*) (*)先頭のVはカウントミスでした.先程消去しました.失礼致しました.
guest

回答2

0

PandasのDataFrameに読み込んで、str[]でスライスを取得し、str.replace-を削除。
V2列を取り除いて、インデックスなしでCSVに出力。

Python

1import pandas as pd 2import io 3 4txt = """ 5Entry,V2 6A0K7T1,----MSNKGQL-LQDPFLNALRKEHVPVSIYLVNGIKLQGNIESFDQYVVL-------LR 7A0KGS1,-----MAKGQS-LQDPFLNALRRERIPVSIYLVNGIKLQGQIESFDQFVIL-------LK 8A0KSR7,-----MAKGQS-LQDPFLNALRRERVPVSIYLVNGIKLQGQVESFDQFVIL-------LK 9A0Q0M9,-----MNKSTNNLQDLFLNNARINRISVTIFLTNGYKLEGLVKGFDNFTII-------LD 10A0Q6S3,-----MSRISS-LQDPFLNALRKEKVSVSVYLVNGIKLQGQVEAFDQFCIV-------LR 11""" 12 13df = pd.read_csv(io.StringIO(txt)) 14# df = pd.read_csv('target.csv') 15 16df['Part1'] = df['V2'].str[10:15].str.replace('-', '') 17df['Part2'] = df['V2'].str[50:60].str.replace('-', '') 18 19df.drop(columns='V2', inplace=True) 20 21print(df) 22 23df.to_csv('result.csv', index=None)

result

1Entry,Part1,Part2 2A0K7T1,LLQD,LLR 3A0KGS1,SLQD,LLK 4A0KSR7,SLQD,LLK 5A0Q0M9,NNLQD,ILD 6A0Q6S3,SLQD,VLR

投稿2020/11/09 07:57

Daregada

総合スコア11990

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

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

Daregada

2020/11/09 08:06

見事にかぶりました。
Male_soprano

2020/11/09 09:41

有難うございます.参考になります. 大変恐縮ですが,ファイル名を指定してから処理を行う形だとどのような書き方になるのか,後学の為にご教示いただいても宜しいでしょうか?
Daregada

2020/11/09 12:19

「df = 」の行の下にコメントで書いてある通りです。
guest

0

str[開始:終了]にて文字列を抽出しstr.replace-を``に置換することで削除できます。

Python

1import pandas as pd 2from io import StringIO 3 4s = """Entry,V2 5A0K7T1,----MSNKGQL-LQDPFLNALRKEHVPVSIYLVNGIKLQGNIESFDQYVVL-------LR 6A0KGS1,-----MAKGQS-LQDPFLNALRRERIPVSIYLVNGIKLQGQIESFDQFVIL-------LK 7A0KSR7,-----MAKGQS-LQDPFLNALRRERVPVSIYLVNGIKLQGQVESFDQFVIL-------LK 8A0Q0M9,-----MNKSTNNLQDLFLNNARINRISVTIFLTNGYKLEGLVKGFDNFTII-------LD 9A0Q6S3,-----MSRISS-LQDPFLNALRKEKVSVSVYLVNGIKLQGQVEAFDQFCIV-------LR""" 10df = pd.read_csv(StringIO(s)) 11 12df['V2'] = df['V2'] 13df['Part1'] = df['V2'].str[10:15].str.replace('-','') 14df['Part2'] = df['V2'].str[50:60].str.replace('-','') 15 16print(df.iloc[:,[0,2,3]]) 17# Entry Part1 Part2 18#0 A0K7T1 LLQD LLR 19#1 A0KGS1 SLQD LLK 20#2 A0KSR7 SLQD LLK 21#3 A0Q0M9 NNLQD ILD 22#4 A0Q6S3 SLQD VLR

投稿2020/11/09 07:59

can110

総合スコア38341

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

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

Male_soprano

2020/11/09 09:41

有難うございます.参考になります. 大変恐縮ですが,ファイル名を指定してから処理を行う形だとどのような書き方になるのか,後学の為にご教示いただいても宜しいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問