前提・実現したいこと
MacでVSCode(Python3)を利用しています。
isinを利用して、指定(下記only_train_honorific)項目以外を抽出したいのですが、全ての項目が入ったデータで抽出されてしまいます。(発生している問題・エラーメッセージの「honorific」項目参照)
上記、、原因がお分かりの方が入れば、ご教示いただけますと幸いです。
発生している問題・エラーメッセージ
#print結果
PassengerId Survived Pclass ... Cabin Embarked honorific
0 1 0 3 ... NaN S Mr
1 2 1 1 ... C85 C Mrs
2 3 1 3 ... NaN S Miss
3 4 1 1 ... C123 S Mrs
4 5 0 3 ... NaN S Mr
.. ... ... ... ... ... ... ...
886 887 0 2 ... NaN S Rev
887 888 1 1 ... B42 S Miss
888 889 0 3 ... NaN S Miss
889 890 1 1 ... C148 C Mr
#titanic_train[honorific]に含まれる全項目
Capt
Col
Don
Dr
Jonkheer
Lady
Major
Master
Miss
Mlle
Mme
Mr
Mrs
Ms
Rev
Sir
the Countess
該当のソースコード
import pandas as pd
import numpy as np
only_train_honorific=["Capt","Don","Jonkheer","Lady","Major","Mlle","Mme","Sir","the Countess"]
train_omit1=titanic_train[~titanic_train["honorific"].isin(only_train_honorific)].reset_index(drop=True)
print(train_omit1)
追記
import pandas as pd
#train.csvはタイタニック提供のデータをそのまま利用しています。
titanic_train=pd.read_csv("train.csv")
only_train_honorific=["Capt","Don","Jonkheer","Lady","Major","Mlle","Mme","Sir","the Countess",]
titanic_train["honorific"]=titanic_train["Name"].map(lambda x: x.split(",")[1].split(".")[0])
train_omit1=titanic_train[~titanic_train["honorific"].isin(only_train_honorific)].reset_index(drop=True)
print(titanic_train["honorific"].value_counts())
print(train_omit1["honorific"].value_counts())
#print結果
Mr 517
Miss 182
Mrs 125
Master 40
Dr 7
Rev 6
Col 2
Mlle 2
Major 2
Jonkheer 1
Ms 1
Don 1
Sir 1
Lady 1
Capt 1
the Countess 1
Mme 1
Name: honorific, dtype: int64
Mr 517
Miss 182
Mrs 125
Master 40
Dr 7
Rev 6
Col 2
Mlle 2
Major 2
Jonkheer 1
Ms 1
Don 1
Sir 1
Lady 1
Capt 1
the Countess 1
Mme 1
Name: honorific, dtype: int64
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
~titanic_train["honorific"].isin(only_train_honorific)
でブール配列の否定をとっているので、only_train_honorific が含まれない行の抽出になっていないでしょうか。
追記
Kaggle の titanic データセットだと思いますが、表題の現象は再現しません。
指定した敬称を含む行は質問のコードで意図通り除かれていると思います。
import pandas as pd
train = pd.read_csv(
"https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
)
exclude_cols = [
"Capt",
"Don",
"Jonkheer",
"Lady",
"Major",
"Mlle",
"Mme",
"Sir",
"the Countess",
]
train["honorific"] = train["Name"].map(lambda x: x.split(", ")[1].split(". ")[0])
train2 = train[~train["honorific"].isin(exclude_cols)].reset_index(drop=True)
print(train["honorific"].value_counts())
print(train2["honorific"].value_counts())
追記
原因
敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。以下のように修正するといいと思います。
- lambda x: x.split(",")[1].split(".")[0]
+ lambda x: x.split(", ")[1].split(". ")[0]
質問のコードだと
Graham, Miss. Margaret Edith
↓ "," で分割し、後ろを抽出 (x.split(",")[1])
Miss. Margaret Edith
↓ "." で分割し、前を抽出 (x.split(",")[1].split(".")[0])
Miss
修正後のコード全体
import pandas as pd
# train.csvはタイタニック提供のデータをそのまま利用しています。
titanic_train = pd.read_csv("train.csv")
only_train_honorific = [
"Capt",
"Don",
"Jonkheer",
"Lady",
"Major",
"Mlle",
"Mme",
"Sir",
"the Countess",
]
titanic_train["honorific"] = titanic_train["Name"].map(
lambda x: x.split(", ")[1].split(". ")[0]
)
train_omit1 = titanic_train[
~titanic_train["honorific"].isin(only_train_honorific)
].reset_index(drop=True)
print(titanic_train["honorific"].value_counts())
print(train_omit1["honorific"].value_counts())
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/04/06 21:55 編集
下記記載に誤りがございました、、
誤)指定(下記only_train_honorific)項目のみを抽出
正)指定(下記only_train_honorific)項目以外を抽出
上記処理を行っても「train_omit1」には「only_train_honorific」も含まれた状態となってしまいます。
何が原因となっているのでしょうか、?
2020/04/07 00:13
もし解決しない場合はコピペすれば動作するコード全体を記載してください。
2020/04/09 21:29
丁寧なご返信ありがとうございます!
いただいたコードの場合、上手く処理ができました!
ただ、こちらも踏まえて、一部修正を行い実施をしたのですが、上手くいきませんでした、、
(上記、追記部分をコピペでご確認いただけますと幸いです)
※train.csvデータは大変お手数ですが、下記より同名のコードをダウンロードいただけますと幸いです。https://www.kaggle.com/c/titanic/data
お忙しい中お手数ですが、何卒宜しくお願い致します🙇♂️
2020/04/09 22:28
敬称を抽出した際に " Ms" のように空白が入ってしまい、マッチしなくなっているのが原因です。
2020/04/11 22:40
ありがとうございます!!
こちらで上手くいきました!!
丁寧に最後までご対応いただきありがとうございました!!🙇♂️