teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正

2020/04/09 13:31

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ### 原因
38
38
 
39
- 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。
39
+ 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。以下のように修正するといいと思います。
40
40
 
41
41
  ```diff
42
42
  - lambda x: x.split(",")[1].split(".")[0]

2

修正

2020/04/09 13:31

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -30,4 +30,53 @@
30
30
 
31
31
  print(train["honorific"].value_counts())
32
32
  print(train2["honorific"].value_counts())
33
+ ```
34
+
35
+ ## 追記
36
+
37
+ ### 原因
38
+
39
+ 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。
40
+
41
+ ```diff
42
+ - lambda x: x.split(",")[1].split(".")[0]
43
+ + lambda x: x.split(", ")[1].split(". ")[0]
44
+ ```
45
+
46
+ 質問のコードだと
47
+
48
+ `Graham, Miss. Margaret Edith`
49
+ ↓ "," で分割し、後ろを抽出 (x.split(",")[1])
50
+ ` Miss. Margaret Edith`
51
+ ↓ "." で分割し、前を抽出 (x.split(",")[1].split(".")[0])
52
+ ` Miss`
53
+
54
+ ### 修正後のコード全体
55
+
56
+ ```
57
+ import pandas as pd
58
+
59
+ # train.csvはタイタニック提供のデータをそのまま利用しています。
60
+ titanic_train = pd.read_csv("train.csv")
61
+
62
+ only_train_honorific = [
63
+ "Capt",
64
+ "Don",
65
+ "Jonkheer",
66
+ "Lady",
67
+ "Major",
68
+ "Mlle",
69
+ "Mme",
70
+ "Sir",
71
+ "the Countess",
72
+ ]
73
+ titanic_train["honorific"] = titanic_train["Name"].map(
74
+ lambda x: x.split(", ")[1].split(". ")[0]
75
+ )
76
+ train_omit1 = titanic_train[
77
+ ~titanic_train["honorific"].isin(only_train_honorific)
78
+ ].reset_index(drop=True)
79
+
80
+ print(titanic_train["honorific"].value_counts())
81
+ print(train_omit1["honorific"].value_counts())
33
82
  ```

1

修正

2020/04/09 13:26

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -1,1 +1,33 @@
1
- `~titanic_train["honorific"].isin(only_train_honorific)` でブール配列の否定をとっているので、only_train_honorific が含まれない行の抽出になっていないでしょうか。
1
+ `~titanic_train["honorific"].isin(only_train_honorific)` でブール配列の否定をとっているので、only_train_honorific が含まれない行の抽出になっていないでしょうか。
2
+
3
+ ## 追記
4
+
5
+ Kaggle の titanic データセットだと思いますが、表題の現象は再現しません。
6
+ 指定した敬称を含む行は質問のコードで意図通り除かれていると思います。
7
+
8
+ ```python
9
+ import pandas as pd
10
+
11
+ train = pd.read_csv(
12
+ "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
13
+ )
14
+
15
+ exclude_cols = [
16
+ "Capt",
17
+ "Don",
18
+ "Jonkheer",
19
+ "Lady",
20
+ "Major",
21
+ "Mlle",
22
+ "Mme",
23
+ "Sir",
24
+ "the Countess",
25
+ ]
26
+ train["honorific"] = train["Name"].map(lambda x: x.split(", ")[1].split(". ")[0])
27
+
28
+
29
+ train2 = train[~train["honorific"].isin(exclude_cols)].reset_index(drop=True)
30
+
31
+ print(train["honorific"].value_counts())
32
+ print(train2["honorific"].value_counts())
33
+ ```