Top > Python

エクセルとPythonの関数の比較



エクセルが大好きな皆さんこんにちは。
今時の多くのビジネスパーソンや大学生はExcelでの作業に慣れていることかと思います。

Excelの良いところは、
  • 何より普及しまくっている(誰でも使える前提)
  • 全体的に直感的に使える
  • 条件付き書式やグラフで可視化が簡単
  • ピボットテーブルが非常に便利
  • わからないことがあってもネット情報に情報が大量にある

  • 逆に良くないところは、
  • 重い
  • 手が滑ってセルの値を書き換えてしまう(元ファイルの毀損)
  • 作業履歴が残らないので意図的な手動(非関数)作業内容が不明
  • セルごとに関数が柔軟に入れられてしまうため、イレギュラーに気が付かない
  • 元データをアップデートした際に手間が掛かる
  • ありものの関数しか使えない
  • Excel以外のフォーマットへの参照が(基本的には)出来ない(csvを除く)

  • こうしたExcelの良くないところをPythonで補完が出来ます。つまり、必要に応じてExcelとPythonを使い分ければ良いわけです。
    徐々にエクセルからPythonに移行しましょう!

    特に定期的に発生する面倒な集計でPythonによるデータ集計が力を発揮するように思います。
    そこで、まずはExcelとPythonで関数の扱い方がどのように違うかをサンプルデータをベースに紹介しようと思います。

    ■サンプルデータ:光熱費データ
    サンプルデータ:光熱費データ サンプルデータ:光熱費データ

    サンプルデータには、AさんとBさんの2017年分の光熱費が月次で記録されています。
    以下に、上記のデータを元にExcelの場合とPythonの場合で、記述がどのように違うのかまとめました。
    ※Pythonでは様々なライブラリが存在しますが、今回はデータ分析でよく用いられるPandasのデータフレームを使って代表的な関数をまとめました。

    Excelはセルベースの構造になっている一方で、
    Pandasはカラム(とインデックス)ベースの構造になっていることが大きな違いです。

    ■エクセルとPythonの主な関数と機能の比較表

    Excel Python (Pandas)
    足し算 =SUM(D2:D73) df["料金"].sum()
    (数値の)カウント =COUNT(D2:D73) df["料金"].count()
    平均 =AVERAGE(D2:D73) df["料金"].mean()
    if文 =IF(AND(C2="水道",D2=0),"不請求月","") ※各行にコピー df.apply(lambda row:["不請求月" if row["区分"]=="水道" and row["料金"] == 0 else ""], axis=1)
    条件付き計算 =SUMIF(B2:B73,"Aさん",D2:D73) df[df["Who"] == "Aさん"]["料金"].sum()
    結合(Mapping) =VLOOKUP(検索キー, 範囲, 範囲内列番号) pandas.merge(左側のデータフレーム, 右側のデータフレーム, on=検索キー)
    欠損値穴埋め =if(D2="",0,D2) ※列を追加する場合 df["料金"].fillna(0)
    クロス集計 (ピボットテーブル機能) pandas.crosstab(df["Who"], df["区分"], values=df["料金"], aggfunc="sum")
    ピボットテーブル (ピボットテーブル機能) df.pivot_table("料金", index="区分",columns="Who", aggfunc="mean") ※もしくはpivottablejsを利用
    文字列の検索 (検索機能:Ctrl+F) df[df["区分"].str.contains("水道",na=False)] ※startswith、endswithで前方一致・後方一致検索
    文字列の置換 (置換機能:Ctrl+H) ※置換履歴が残らない df.replace("電力", "電気")
    行の削除 (手動) ※削除履歴が残らない df[df["区分"] != "水道"]
    データ上書き (手動) ※上書き履歴が残らない df["料金"][(df["Who"]=="Aさん")&(df["区分"]=="電力")&(df["YYYYMM"]=="2017/01")] = 11918
    重複削除 (重複削除機能) ※削除履歴が残らない df.drop_duplicates(['YYYYMM', '区分', 'Who'], keep=last)



    Ads by Google