Advertisement

More Related Content

Slideshows for you(20)

Similar to PandasとSQLとの比較(20)

Advertisement

Recently uploaded(20)

Advertisement

PandasとSQLとの比較

  1. PandasとSQLとの比較 発表者:トビウオ
  2. Pandasとは? Python向けの、データ解析支援ライブラリ import pandas as pd df = pd.read_csv(‘sample1.csv’) df. fillna(0, inplace=True) df[‘B’] = df[‘A’].map(lambda x: x * 2) print(df) df.to_csv(‘result.csv’) import宣言 読み込み 加工 変換 表示 出力
  3. Pandasの特徴 CSV・Excel・Parquet・RDB……など、様々なデータ ソースからデータを取得・操作・保存できる 内部構造にNumPyを使用することで処理が高速 可能な操作は多種多様 今回SQLと比較する
  4. 先頭X行 / 末尾X行 id name age type 1 A 21 aaa 2 B 37 bbb 3 C 44 ccc 4 D 30 bbb 5 E 18 ddd 6 F 53 ccc 7 G 7 fff 8 H 82 eee id name age type 1 A 21 aaa 2 B 37 bbb id name age type 7 G 7 fff 8 H 82 eee
  5. 先頭X行 / 末尾X行 df_a.head(5) / df_a.tail(5) SELECT * FROM table_a (ORDER BY id) LIMIT 5 DataFrameの先頭X行・末尾X行を取り出す。 それぞれdf_a[:5]やdf_a[-5:]と同じ意味。 SELECTした結果からX行分だけ取り出す。 DataFrameと違いテーブルには順序が無いため、 ORDER BYしないと取得結果が一意にならない!
  6. 大きさ / 列 / 行 / 型 id name age type 1 A 21 aaa 2 B 37 bbb 3 C 44 ccc 4 D 30 bbb 5 E 18 ddd 6 F 53 ccc 7 G 7 fff 8 H 82 eee • 8行4列 • id列、name列、age列、type列 • id列が主キーで、値は1〜8 • id列とage列は整数型 • nameとtypeは文字列型
  7. df_a.shape / df_a.index / df_a.columns / df_a.dtypes SELECT COUNT(*) FROM table_a これは総行数が返るクエリ。 総列数や主キー列、列名一覧や列ごとの型一覧といった 他の情報はRDBによってコマンドや方法が異なる。 DataFrameの行数と列数、indexについての情報、 列についての情報、列ごとの型についての情報を返す。 大きさ / 列 / 行 / 型
  8. 指定列・指定行だけ取り出し id name age type 1 A 21 aaa 2 B 37 bbb 3 C 44 ccc 4 D 30 bbb 5 E 18 ddd 6 F 53 ccc 7 G 7 fff 8 H 82 eee id name age type 5 E 18 ddd 6 F 53 ccc name A B C D E F G H
  9. df_a[‘c_1’] df_a[[‘c_1’, ‘c_2’]] df_a[3:7] SELECT c_1, c_2 FROM table_a OFFSET 3 LIMIT 4 どの列が欲しいかを明示的に指定することができる。 Pythonの「X:X+Y」はSQLの「OFFSET X LIMIT Y」と同等。 LIMITだけでなくOFFSETもORDER BY問題が存在する。 1つ目はSeries型が返り、後ろ2つはDataFrame型が返る。 他にも.locや.ilocメソッドで複合的な絞り込みも可能。 指定列・指定行だけ取り出し
  10. 条件を指定して抽出 id name age type 1 A 21 aaa 2 B 37 bbb 3 C 44 ccc 4 D 30 bbb 5 E 18 ddd 6 F 53 ccc 7 G 7 fff 8 H 82 eee id name age type 1 A 21 aaa 4 D 30 bbb 5 E 18 ddd 7 G 7 fff age≦30
  11. df_a[df_a[’c_1’] > 5] df_a.query(‘c_1 < 20 and c_2 == 3’) SELECT * FROM table_a WHERE c_1 20 AND c_2 = 3 SQLの条件指定と言えばWHERE。 等値比較の書き方がちょい違うことに注意。 どちらも条件を指定して絞り込む構文。 queryメソッドを使うと複雑な条件も書きやすい。 queryだとpandas#evalで入力式が評価される。 条件を指定して抽出
  12. 重複行を排除 id name age type 1 A 21 aaa 2 G 7 fff 3 C 44 ccc 4 D 30 bbb 5 A 21 aaa 6 F 53 ccc 7 G 7 fff 8 C 44 ccc id name age type 1 A 21 aaa 2 G 7 fff 3 C 44 ccc 4 D 30 bbb 6 F 53 ccc
  13. df_a[‘c_1’].unique() SELECT DISTINCT c_1 FROM table_a 「DISTINCT c_1, c_2」のようにすると、複数列が全て一致し たもののみ重複削除するようにできる。 同一値が複数含まれる場合は、順番が早いものだけ残る。 重複行だけを取り出すduplicated()、 重複行だけを削除するdrop_duplicates()も存在するが、 引数設定が複雑なので詳細略。 重複行を排除
  14. ソート id name age type 1 A 21 aaa 2 B 37 bbb 3 C 44 ccc 4 D 30 bbb 5 E 18 ddd 6 F 53 ccc 7 G 7 fff 8 H 82 eee id name age type 1 A 21 aaa 2 B 37 bbb 4 D 30 bbb 3 C 44 ccc 6 F 53 ccc 5 E 18 ddd 8 H 82 eee 7 G 7 fff
  15. df_a.sort_values(by=‘c_1’, ascending=False) SELECT * FROM table_a ORDER BY c_1 DESC こちらもデフォルトが昇順なので、降順にするには 「DESC」と明記する必要がある。 byには複数列を「[‘c_1’, ‘c_2’]」といった風に指定可能。 また、inplace=Trueとすると、破壊的変更も可能。 ascendingはデフォルト値がTrue(昇順)。 ソート
  16. 結合 name age A 21 B 37 C 44 name type B aaa C fff A ccc C ddd name type age B aaa 37 C fff 44 A ccc 21 C ddd 44
  17. df_a.merge(df_b, on=‘c_1’) pandas.concat([df_a, df_b]) SELECT * FROM table_a INNER JOIN table_b ON table_a.id=table_b.id SELECT * FROM table_a UNION ALL SELECT * FROM table_b 前者はINNER・OUTER・LEFT OUTER・RIGHT OUTERなど から選べる。後者はUNIONだけにすると重複行が削除される。 前者は、指定したキーを元に2つのDataFrameを結合する。 結合方式はhow引数から指定でき、’inner’・’outer’・’left’・ ’right’から選べる。後者は行 or 列方向に単純結合する。 結合
  18. その他、SQLでは難しい処理 df_a.resample(‘D’).mean() 月・日付などの単位でグルーピングしてから、平均・最大・最小などを求めること ができる。SQLだと、「CASE句で日付などの単位に変換した列を用意した サブクエリに対してGROUP BY」といった複雑なクエリになる。 df_a.dropna() df_a.fillna(value=0) NaN値が入った行・列を削除したり、適当な値で補完できる。SQLだと削除は WHERE句で可能だが補完はCASE句を駆使することになって複雑なクエリになる。 df_a[‘c_1’].value_counts() 指定した列について、入っている値がそれぞれ何個あるかをカウントする。 SQLだとGROUP BYしてそれぞれCOUNT()する必要があって複雑なクエリになる。
  19. 参考資料 データ分析で頻出のPandas基本操作 - Qiita
Advertisement