はじめに
本記事では、『Python実践データ分析100本ノック』
(参考: https://www.shuwasystem.co.jp/book/9784798067278.html)
を用いて僕が第11問~第20問に挑戦した過程での失敗談や気づきをまとめます。
Qiita初心者の立場から、意味がわからなかったポイント、理解に苦しんだ処理、
遭遇したエラー、そして僕の感想を記載しています。
感想:データには人間のミスが意外と多く潜んでいることを痛感しました。
半角・全角の混在や大文字小文字の揺れ、欠損値など、前処理を怠るとその後の集計が歪んでしまいます。
目次
- 意味がわからなかったもの
- 理解に苦しんだ処理
- 発生したエラーと対処法
- 僕の気づきと感想
- 次のステップ
1. 意味がわからなかったもの
.loc
と条件抽出
filtered = df.loc[df['列名'] == '値']
-
解説:
loc[行条件, 列名]
で DataFrame を絞り込みます。df['列名'] == '値'
がTrue
の行だけを取得できます。
.unique()
values = df['item_name'].unique()
- 解説:Series から重複を除いた一意な値を抽出し、NumPy 配列として返します。
論理否定の ~
mask = ~df['フラグ']
-
解説:
True/False
を反転します。df['フラグ']
がFalse
の行を選びたいときに用います。
Excelシリアル値のバグ補正
Excelは1900年2月29日という実在しない日を誤ってカウントします。そのため、シリアル値を日付に変換するときには2日分の補正(- 2
)が必要です。
serial_dates = (
pd.to_timedelta(serial_number.astype(float) - 2, unit='D')
+ pd.to_datetime('1900-01-01')
)
2. 理解に苦しんだ処理
astype('str').str.isdigit()
mask = df['登録日'].astype('str').str.isdigit()
- 目的:文字列がすべて数字のみで構成されているか判定し、Excelシリアル値を識別します。`
pd.concat
による結合
df['登録日'] = pd.concat([serial_dates, parsed_dates])
- 目的:シリアル変換した日付と、既存の日付文字列を日付型に変換した結果を1列に統合し、元の DataFrame を更新します。
pd.merge(..., how='left')
によるジョイン
joined = pd.merge(
uriage_data,
kokyaku_data,
left_on='customer_name',
right_on='顧客名',
how='left'
)
-
目的:売上データと顧客マスタを左結合し、一致しない顧客は
NaN
のまま残します。
3. 発生したエラーと対処法
エラー内容 | 原因 | 対処法 |
---|---|---|
AttributeError: 'StringMethods' object has no attribute 'uppper' |
str.uppper() のタイポ |
str.upper() に修正 |
AttributeError: module 'pandas' has no attribute 'to_datetiime' |
pd.to_datetiime() のタイプミス |
pd.to_datetime() に修正 |
欠損値処理で比較マッチしない |
NaN は == で比較すると必ず False になる |
isnull() と ~ を併用してフィルタリング |
4. 僕の気づきと感想
-
ヒアリングの重要性:表記揺れ(半角⇔全角、同義語など)はプログラムだけでは完全に解消できないことを知りました。面倒ではありますが担当者への確認とヒアリングが必要です。
-
前処理の徹底:欠損値補完、文字列クレンジング、データ型統一が不足すると、後続処理が破綻します。
isnull()
→fillna()
ordropna()
のワークフローを明文化しましょう。 -
テストデータの用意:予期しない入力に備えて、エッジケースを網羅するテストケースを用意する習慣が必要です。
5. 次のステップ
次回は第21問~30問に取り組み、同様に失敗と学びを記録します。また、処理の自動化やテスト駆動開発(TDD)の導入についても検討したいと考えています。
参考:第1~10問の振り返り → https://qiita.com/do-raku/items/e1b18214fb9b59111066
ではまたー