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

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

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

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

Python 3.x

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

Q&A

解決済

2回答

1228閲覧

csvの特定の列から文字を抽出したい

bercerknober

総合スコア5

CSV

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

Python 3.x

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

0グッド

0クリップ

投稿2020/01/18 16:31

編集2020/01/18 16:32

前提・実現したいこと

初心者です
Pythonを使って以下のようなcsvファイルをpandasで読み込みました

ID名前自己紹介
1001田中太郎~
1002山田太郎~
1003高橋太郎~ 連絡先:aaabbb@abc.com ~
1004佐々木太郎~ bbbccc@cba.co.jp

このcsvから自己紹介の列に@(もしくはメールアドレス)が含まれる行を1にする列4を作りたいです

ID名前自己紹介列4
1001田中太郎~0
1002山田太郎~0
1003高橋太郎~ 連絡先:aaabbb@abc.com ~1
1004佐々木太郎~ bbbccc@cba.co.jp1

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

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

シンプルにやるなら正規表現で調べることになります。が、正規表現でメールアドレスにマッチさせようとすると死ぬほど大変というか、厳密に正しいやり方は誰も知らないような問題です。

PHP - PHPで正規表現でmailを取り扱いたい|teratail

悪夢かいな。

なのでメールアドレスを表す現実的な正規表現(Qiita)を参考にやってみます。これはすべてのメールアドレスにはマッチしませんが、現実的にはこの程度で十分でしょ、というものです。

python

1>>> import pandas as pd 2>>> df = pd.DataFrame({"ID":[1001, 1002, 1003, 1004], "名前":["田中太郎", "山田太郎", "高橋太郎", "佐々木太郎"], "自己紹介":["~ ", "~ ", "~ 連絡先:aaabbb@abc.com ~ ", "~ bbbccc@cba.co.jp"]}) 3>>> df["自己紹介"].str.contains(r"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*") 40 False 51 False 62 True 73 True 8Name: 自己紹介, dtype: bool

どうやら判定はできているようなので、あとはint型に変換して新規列として入れてあげればよいかと。

python

1>>> df["列4"] = df["自己紹介"].str.contains(r"[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*").astype("int64") 2>>> df 3 ID 名前 自己紹介 列4 40 1001 田中太郎 ~ 0 51 1002 山田太郎 ~ 0 62 1003 高橋太郎 ~ 連絡先:aaabbb@abc.com ~ 1 73 1004 佐々木太郎 ~ bbbccc@cba.co.jp 1

pandas.Series.str.contains — pandas 0.25.3 documentation

投稿2020/01/18 16:47

hayataka2049

総合スコア30933

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

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

0

単純に@が含まれているかだけで判断してよければpandas.Series.str.containsが使えます。

Python

1import pandas as pd 2 3df = pd.DataFrame({'msg':['ab','@cd','@ef@']}) 4df['ret'] = df['msg'].str.contains('@') * 1 5print(df) 6""" 7 msg ret 80 ab 0 91 @cd 1 102 @ef@ 1 11"""

以下、問題を勘違いしていたようなので取り消し

pandas.Series.str.countで個数を得ることができます。

Python

1import pandas as pd 2 3df = pd.DataFrame({'msg':['ab','@cd','@ef@']}) 4df['ret'] = df['msg'].str.count('@') 5print(df) 6""" 7 msg ret 80 ab 0 91 @cd 1 102 @ef@ 2 11"""

投稿2020/01/18 16:42

編集2020/01/18 16:54
can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問