回答編集履歴

5

d

2019/08/29 05:51

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -201,3 +201,75 @@
201
201
 
202
202
 
203
203
  * [pandas.DataFrame.drop_duplicates — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html)
204
+
205
+
206
+
207
+ ----
208
+
209
+
210
+
211
+ ## pandas の質問をする際に推奨される形式
212
+
213
+
214
+
215
+ ### 行いたい処理
216
+
217
+
218
+
219
+ 重複する場合は最初の要素に1、それ以外は0のフラグを立てた列を追加する
220
+
221
+
222
+
223
+ ### 入力の Data Frame
224
+
225
+
226
+
227
+ ```
228
+
229
+ uid
230
+
231
+ 0 u2200
232
+
233
+ 1 u2200
234
+
235
+ 2 u2200
236
+
237
+ 3 u2111
238
+
239
+ 4 u2111
240
+
241
+ 5 u2009
242
+
243
+ 6 u2009
244
+
245
+ 7 u2001
246
+
247
+ ```
248
+
249
+
250
+
251
+ ### 希望する Data Frame
252
+
253
+
254
+
255
+ ```
256
+
257
+ uid first_apply
258
+
259
+ 0 u2200 1
260
+
261
+ 1 u2200 0
262
+
263
+ 2 u2200 0
264
+
265
+ 3 u2111 1
266
+
267
+ 4 u2111 0
268
+
269
+ 5 u2009 1
270
+
271
+ 6 u2009 0
272
+
273
+ 7 u2001 1
274
+
275
+ ```

4

d

2019/08/29 05:51

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -160,13 +160,13 @@
160
160
 
161
161
  df = pd.DataFrame(
162
162
 
163
- {"uid": ["u2200", "u2200", "u2111", "u2111", "u2009", "u2009", "u2001"]}
163
+ {"uid": ["u2200", "u2200", "u2200", "u2111", "u2111", "u2009", "u2009", "u2001"]}
164
164
 
165
165
  )
166
166
 
167
167
 
168
168
 
169
- df["first_apply"] = df.duplicated("uid", keep="last").astype(int)
169
+ df["first_apply"] = (~df.duplicated("uid", keep="first")).astype(int)
170
170
 
171
171
 
172
172
 
@@ -178,15 +178,17 @@
178
178
 
179
179
  # 1 u2200 0
180
180
 
181
+ # 2 u2200 0
182
+
181
- # 2 u2111 1
183
+ # 3 u2111 1
182
-
184
+
183
- # 3 u2111 0
185
+ # 4 u2111 0
184
-
186
+
185
- # 4 u2009 1
187
+ # 5 u2009 1
186
-
188
+
187
- # 5 u2009 0
189
+ # 6 u2009 0
188
-
190
+
189
- # 6 u2001 0
191
+ # 7 u2001 1
190
192
 
191
193
  ```
192
194
 

3

d

2019/08/29 05:47

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -140,6 +140,60 @@
140
140
 
141
141
 
142
142
 
143
+ ## 追記
144
+
145
+
146
+
147
+ もしかして、質問者さんがやりたいことは「重複を削除する」ではなく、「重複する場合は最初の要素に1、それ以外は0のフラグを立てた列を追加する」ということでしょうか?
148
+
149
+
150
+
151
+ [pandas.DataFrame.duplicated — pandas 0.25.1 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.duplicated.html)
152
+
153
+
154
+
155
+ ```python
156
+
157
+ import pandas as pd
158
+
159
+
160
+
161
+ df = pd.DataFrame(
162
+
163
+ {"uid": ["u2200", "u2200", "u2111", "u2111", "u2009", "u2009", "u2001"]}
164
+
165
+ )
166
+
167
+
168
+
169
+ df["first_apply"] = df.duplicated("uid", keep="last").astype(int)
170
+
171
+
172
+
173
+ print(df)
174
+
175
+ # uid first_apply
176
+
177
+ # 0 u2200 1
178
+
179
+ # 1 u2200 0
180
+
181
+ # 2 u2111 1
182
+
183
+ # 3 u2111 0
184
+
185
+ # 4 u2009 1
186
+
187
+ # 5 u2009 0
188
+
189
+ # 6 u2001 0
190
+
191
+ ```
192
+
193
+
194
+
195
+
196
+
143
197
  ## 参考文献
144
198
 
145
199
 

2

d

2019/08/29 05:45

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -60,6 +60,86 @@
60
60
 
61
61
 
62
62
 
63
+ ## エラーの発生した原因について
64
+
65
+
66
+
67
+ > これは関数の中でやろうとしていることが問題なのでしょうか?
68
+
69
+
70
+
71
+ 質問のコードで1つずつ処理の流れを追っていくと、
72
+
73
+
74
+
75
+ 1. data['uid'] で DataFrame の列 uid を Series オブジェクトで取得する。
76
+
77
+
78
+
79
+ ```
80
+
81
+ import pandas as pd
82
+
83
+
84
+
85
+ df = pd.DataFrame(
86
+
87
+ {"uid": ["u2200", "u2200", "u2111", "u2111", "u2009", "u2009", "u2001"]}
88
+
89
+ )
90
+
91
+ print(df["uid"])
92
+
93
+ # 0 u2200
94
+
95
+ # 1 u2200
96
+
97
+ # 2 u2111
98
+
99
+ # 3 u2111
100
+
101
+ # 4 u2009
102
+
103
+ # 5 u2009
104
+
105
+ # 6 u2001
106
+
107
+ # Name: uid, dtype: object
108
+
109
+ ```
110
+
111
+
112
+
113
+ 2. Series オブジェクトの apply を呼び出しているので、Series オブジェクトの各要素が1つずつ apply に指定した関数に渡される。
114
+
115
+ なので、apply 関数 (Series.apply ではなく、質問者さんが作成した方) の first 引数には Python の str 型のオブジェクトが渡ってきます。
116
+
117
+
118
+
119
+ 3. str クラスには drop_duplicates という Attribute は存在しないので、以下のエラーになります。
120
+
121
+
122
+
123
+ ```python
124
+
125
+ def apply(first): #← first に渡されるのは str (例: "u2200")
126
+
127
+ first.drop_duplicates #← ここでエラー発生
128
+
129
+ return 1
130
+
131
+ ```
132
+
133
+
134
+
135
+ > AttributeError: 'str' object has no attribute 'drop_duplicates'
136
+
137
+
138
+
139
+ > 属性エラー: str オブジェクトは drop_duplicates という属性を持っていません。
140
+
141
+
142
+
63
143
  ## 参考文献
64
144
 
65
145
 

1

d

2019/08/29 05:39

投稿

tiitoi
tiitoi

スコア21960

test CHANGED
@@ -21,6 +21,24 @@
21
21
  {"uid": ["u2200", "u2200", "u2111", "u2111", "u2009", "u2009", "u2001"]}
22
22
 
23
23
  )
24
+
25
+ print(df)
26
+
27
+ # uid
28
+
29
+ # 0 u2200
30
+
31
+ # 1 u2200
32
+
33
+ # 2 u2111
34
+
35
+ # 3 u2111
36
+
37
+ # 4 u2009
38
+
39
+ # 5 u2009
40
+
41
+ # 6 u2001
24
42
 
25
43
 
26
44