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

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

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

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

pandas

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

Q&A

解決済

4回答

2433閲覧

どんな特殊文字があるのか、特定したい

shin_shin

総合スコア96

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2018/03/08 05:31

編集2018/03/08 06:02

【前提】
・扱うのは、10万行,237列のデータのデータフレーム
・すべての特殊文字は、少なくとも、"-" or "*"(アスタリスク)が含まれていることがわかっている

下記のコードで、「どのコラムのデータで上記の記号が含まれているのか?」は特定できました。

Python

1col_list = [] 2# See the columns with "-" or "*" character inside of each datapoint 3for col in df.columns: 4 if df[col].dtype == object: 5 if (df[col].str.contains("-")).any() == True: 6 col_list.append(col) 7 elif(df[col].str.contains("*")).any() == True: 8 col_list.append(col) 9 else: 10 continue

しかしその後の、「どんな特殊文字があるのか?」を特定するコードがわからず、今苦戦しています。

一応下記に、なぜこの疑問を解決したいのか?の背景を説明いたします。

【背景】
「最終目標」
データフレームの中に存在するすべての特殊文字を削除したい

「目標達成するためのステップ」
・どんな特殊文字があるのかを特定
・その特殊文字ごとにfor文を作り、「"□"」(シングルスペース)に入れ替える
・スペースを埋める

今回の質問は、上記のステップ1を解決したい、というものです。

めんどくさい質問で恐縮ですが、ご教授のほど、よろしくお願いいたします。

----------------------追加--------------------------------------------
理論上、以下のコードでできると考えましたが、これでは時間がかかりすぎると思いました。

python

1special_character_list = [] 2 3for col in col_list_special: 4 for i in range(len(df[col.index])): 5 if df[col][i].str.contain("-") or df[col][i].str.contain("*"): 6 special_character_list.append(df[col][i]) 7special_character_list = set(special_character_list)

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

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

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

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

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

y_waiwai

2018/03/08 05:39

あなたのいう特殊文字というのはいったいなんですか?
shin_shin

2018/03/08 05:42

"* 10:00"の”*”だったり、”- 0.1”の”-”とかのSpecial Characterを意図しています。
y_waiwai

2018/03/08 05:46

いや、具体的に。それだけだと”はどっち?’?’はどっち?とキリがないですがなw
y_waiwai

2018/03/08 05:47

そんなふわっとした定義では答えようないです
shin_shin

2018/03/08 05:50

たくさん種類があって、目視ではすべて特定できなかったです。ですが、special characeterのすべてに、"*"or"-"が必ず一つは含まれています。
y_waiwai

2018/03/08 05:52

んじゃ質問を変えましょう。なぜその「特殊文字」を特定する必要があるのですか?
shin_shin

2018/03/08 05:57

特殊文字をすべて特定できたら、特殊文字が含まれた値を、一つ一つのを適切な値に置き換えるためです。
shin_shin

2018/03/08 05:57

このような感じに置き換えるためです。for col in col_list: df[col] = df[col].replace('- 20:00', "20:00")
mkgrei

2018/03/08 06:02

日本語は含まれますか?アルファベットと数字以外を全部記号として扱って良いですか?
mkgrei

2018/03/08 06:02

コロンは特殊文字ではないのですね…
mkgrei

2018/03/08 06:04

「特殊文字」を列挙できるのであれば、reとapplymapを使うのがはやいです。
shin_shin

2018/03/08 06:05

日本語は含まれません。数字以外をすべて記号として扱ってください。
shin_shin

2018/03/08 06:06

最終的に、すべてのデータをfloat64型に変更します。
guest

回答4

0

特殊文字は何たるかなんてことを悩む必要があるのでしょうか。質問を読む限り、「数字以外削除」で事足りるように思えますが。

new_df = df.applymap(lambda x: re.sub("\D", "", x))

投稿2018/03/08 06:26

KojiDoi

総合スコア13671

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

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

0

ベストアンサー

こんな感じにするといいのではないでしょうか。

python

1import string 2del_list = string.ascii_letters + string.punctuation 3 4for i in del_list : 5 for j in df.columns : 6 df[j] = b[j].str.replace(i,'')

string.ascii_lettersは英文字、astring.punctuationは*や@などの一覧を出力してくれるので、連結したものをdel_listとして定義します。
質問に記載しているコードだと、行数×列数分for文による繰り返しが必要で処理時間がムダな気がするので、Seriesデータに対して一括して処理するようにしています。これだとチェックする文字数×列数なので少しは早く処理できると思います。

投稿2018/03/09 15:37

R.Shigemori

総合スコア3376

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

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

shin_shin

2018/03/12 07:39

助かりました。ありがとうございます!
guest

0

ついでに数字以外の集合も…
データが多いと遅いかも。

python

1from io import StringIO 2import re 3import numpy as np 4import pandas as pd 5 6data = StringIO(''' 7id,content,date 81,-: 54:00, 2/4 92,* 444, 4/4 10''') 11 12df = pd.read_csv(data) 13f = re.compile('[^0-9]') 14ff = lambda s: f.sub('', str(s)) 15fff = lambda s: f.findall(str(s)) 16 17ans = df.applymap(ff) 18other = set(np.sum(df.applymap(fff).values.ravel())) 19 20print(df) 21print(ans) 22print(other)

投稿2018/03/08 07:00

mkgrei

総合スコア8560

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

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

0

三カ所変えました。

Python

1hyphen_list = [] 2asterisk_list = [] 3# See the columns with "-" or "*" character inside of each datapoint 4for col in df.columns: 5 if df[col].dtype == object: 6 if (df[col].str.contains("-")).any() == True: 7 hyphen_list.append(col) 8 elif(df[col].str.contains("*")).any() == True: 9 asterisk_list.append(col) 10 else: 11 continue

投稿2018/03/08 05:46

Zuishin

総合スコア28660

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問