回答編集履歴

3

修正

2020/04/09 13:31

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
 
76
76
 
77
- 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。
77
+ 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。以下のように修正するといいと思います。
78
78
 
79
79
 
80
80
 

2

修正

2020/04/09 13:31

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -63,3 +63,101 @@
63
63
  print(train2["honorific"].value_counts())
64
64
 
65
65
  ```
66
+
67
+
68
+
69
+ ## 追記
70
+
71
+
72
+
73
+ ### 原因
74
+
75
+
76
+
77
+ 敬称を抽出するときに敬称の前に空白が入ってしまっているため、isin() でマッチしなくなっているのが原因です。
78
+
79
+
80
+
81
+ ```diff
82
+
83
+ - lambda x: x.split(",")[1].split(".")[0]
84
+
85
+ + lambda x: x.split(", ")[1].split(". ")[0]
86
+
87
+ ```
88
+
89
+
90
+
91
+ 質問のコードだと
92
+
93
+
94
+
95
+ `Graham, Miss. Margaret Edith`
96
+
97
+ ↓ "," で分割し、後ろを抽出 (x.split(",")[1])
98
+
99
+ ` Miss. Margaret Edith`
100
+
101
+ ↓ "." で分割し、前を抽出 (x.split(",")[1].split(".")[0])
102
+
103
+ ` Miss`
104
+
105
+
106
+
107
+ ### 修正後のコード全体
108
+
109
+
110
+
111
+ ```
112
+
113
+ import pandas as pd
114
+
115
+
116
+
117
+ # train.csvはタイタニック提供のデータをそのまま利用しています。
118
+
119
+ titanic_train = pd.read_csv("train.csv")
120
+
121
+
122
+
123
+ only_train_honorific = [
124
+
125
+ "Capt",
126
+
127
+ "Don",
128
+
129
+ "Jonkheer",
130
+
131
+ "Lady",
132
+
133
+ "Major",
134
+
135
+ "Mlle",
136
+
137
+ "Mme",
138
+
139
+ "Sir",
140
+
141
+ "the Countess",
142
+
143
+ ]
144
+
145
+ titanic_train["honorific"] = titanic_train["Name"].map(
146
+
147
+ lambda x: x.split(", ")[1].split(". ")[0]
148
+
149
+ )
150
+
151
+ train_omit1 = titanic_train[
152
+
153
+ ~titanic_train["honorific"].isin(only_train_honorific)
154
+
155
+ ].reset_index(drop=True)
156
+
157
+
158
+
159
+ print(titanic_train["honorific"].value_counts())
160
+
161
+ print(train_omit1["honorific"].value_counts())
162
+
163
+ ```

1

修正

2020/04/09 13:26

投稿

tiitoi
tiitoi

スコア21956

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