Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PyData.Fukuoka#6_LT_slide
Search
shinpsan
November 22, 2019
Programming
0
410
PyData.Fukuoka#6_LT_slide
前処理するとき便利だからよく
pandas.DataFrame.apply(lambda)
使っちゃうけど遅いから本当は
pandas.Series.map()
使った方がいいと思う
shinpsan
November 22, 2019
Tweet
Share
More Decks by shinpsan
See All by shinpsan
CDLE_Fukuoka_20230523
shinpsan
0
110
LT_コンサル完全に理解したらミドルDSになった_ちゅらNOB合同勉強会
shinpsan
0
330
LT_統計学ユーザーでいいんです_みんなのPython勉強会#70
shinpsan
1
620
"Momochihama Store" on TNC has a wonderful "Udon MAP" section.
shinpsan
0
190
Other Decks in Programming
See All in Programming
Blue/Greenデプロイの導入による 運用フローの改善
kudoas
1
350
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Ruby Function Composition
bkuhlmann
1
330
ONE WEDGE_company_guide
1wedge_one
0
340
puregoの活用例
aethiopicuschan
0
220
educure_カリキュラム生操作マニュアル.pdf
linew_official
0
450
甘い香りに誘われてVanilla Extractを1年間運用してみた
miyahkun
1
110
try! Swift Tokyo 2024のLT枠に採択されたプロポーザルを出すときに考えていたこと
ski
0
340
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.2k
Prepare for Jakarta EE 11 - Performance and Developer Productivity
ivargrimstad
0
410
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
210
SpringBoot+MyBatisで例外が出たときどこを見るか
syukai
0
110
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
59
7.1k
Optimising Largest Contentful Paint
csswizardry
7
2.3k
Navigating Team Friction
lara
177
13k
Learning to Love Humans: Emotional Interface Design
aarron
266
39k
Embracing the Ebb and Flow
colly
78
4.1k
Infographics Made Easy
chrislema
237
18k
Atom: Resistance is Futile
akmur
258
25k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
272
13k
Building an army of robots
kneath
300
41k
Docker and Python
trallard
33
2.7k
Product Roadmaps are Hard
iamctodd
43
9.7k
How to train your dragon (web standard)
notwaldorf
71
5.1k
Transcript
前処理するとき便利だからよく pandas.DataFrame.apply(lambda) 使っちゃうけど遅いから本当は pandas.Series.map() 使った方がいいと思う PyData.Fukuoka #6 LT @shinpsan
自己紹介 下積みの父@shinpsan 小売業のデータサイエンティスト(12月まで。年明け転職します) MENSA会員 合同会社ocojoで副業 twitter : 仕事
: 特技: 趣味:
話すこと タイトルに書いたことが全てです。 pandasの基本的なところなのでみんな知ってる内容かも。 知ってる方はヒマだと思うので、心の中で 「シカ」って10回言った後、 「サンタクロースが乗っているのは?」に答えてて下さい
背景 クソみたいなデータ渡されたと文句言いながら、 いつもクソみたいなコード書いてることを反省。
再現データ ラベル 営業時間 値1 値2 値3 • 1ファイルにつき何個か値が格納された ファイルが大量にある •
それを集めてきて1つのテーブルにした もの • ラベルが元のファイル名
やりたいこと(持っていきたい方向) 店舗の営業時間体系ごとの • 三角おにぎり • パックおにぎり • 寿司 のラベルをつけて集計とか 可視化とかいろいろ
再現データ ラベル 営業時間 値1 値2 値3 • おにぎり、寿司、パックおにぎり 判別はラベルの文字列から可能
• 営業時間は9~21時 or 24時間営業
クソみたいなところ① ラベル 営業時間 値1 値2 値3 ラベルの文字列の長さがバラバラ
クソみたいなところ② ラベル 営業時間 値1 値2 値3 おにぎり、寿司の判別は文字列の先頭 パックおにぎりの判別は文字列の最後
クソみたいなところ③ ラベル 営業時間 値1 値2 値3 ラベルに区切り文字とか入って無い
手順1 ラベル 営業時間 値1 値2 値3 ラベル列の各行に関して、 先頭7文字が”ONIGIRI” かどうか、 先頭5文字が”SUSHI”
かどうか、 最後4文字が”pack” かどうか 判別
手順2 ラベル 営業時間 値1 値2 値3 営業時間列の各行に関して、 “9-21” or “24h”
判別
手順3 ラベル 営業時間 値1 値2 値3 手順1,2の判別を元に 新たなラベル列作成 新ラベル おにぎり_9-21
おにぎり_24h ・ ・ ・
ここで本題 どんな処理書く? • for + iterrows() • df.apply() • Series.map()
①for i, row in {pd.DataFrame}.iterrow(): ラベル 営業時間 値1 値2 値3
データフレームの1行1行に対して ループ処理 処理 ↓ 処理 ↓ 処理 ↓ 処理 ↓ 処理 ↓
①for i, row in {pd.DataFrame}.iterrow():
②{pd.DataFrame}.apply(lambda x: {}) ラベル 営業時間 値1 値2 値3 データフレームの各行に対して 同じ処理を一括適応
lambda x のxには各行が1行のDFにみたいにして渡される x[“ラベル”]みたいにして使うとこ選べる ✖ 処理 ✖ 処理 ✖ 処理 ✖ 処理 ✖ 処理
②{pd.DataFrame}.apply(lambda x: {})
③{pd.Series}.map(lambda x: {}) ラベル ✖ 処理 ✖ 処理 ✖ 処理
✖ 処理 ✖ 処理 Seriesの各要素に対して 同じ処理を一括適応
③{pd.Series}.map(lambda x: {})
None
実行速度比較 1万行まで iterrowsだと1万行のデータで 1~2秒かかる データの行数 処理にかかった時間
実行速度比較 10万行まで df.apply()だと10万行のデータで ~2秒かかる
実行速度比較 1000万行まで Series.map()だと1000万行のデータで 約5秒かかる
まとめ ただの肌感ですが、jupyterで分析してて、 そこまで気にならない待ち時間は2秒くらい • for + iterrows 1万行 • df.apply
10万行 • Series.map 400万行 まぁ、結論としてループは使わない。 df.apply()は何も考えずに記述できるけど遅いから、 Series.map()でやる方がいいですね。
enjoy! 答え:そり(トナカイには乗っていない)