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

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

ただいまの
回答率

88.36%

pandas isinで指定項目のみの抽出方法に関して

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 280

yukicb

score 21

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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())

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

    なるほど、、、
    ありがとうございます!!
    こちらで上手くいきました!!
    丁寧に最後までご対応いただきありがとうございました!!🙇‍♂️

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る