PandasのDataFrame関連でよく使うTips

自分のためのメモ。
主にデータ分析用途でサクッとDataFrameにデータを格納して、いろいろいじりたいときに使う前処理や統計値確認メソッド。

Nullがあるか確認して適当に埋める

# df全体にあるnullの数をカウント
df.isnull().sum()

# 特定のカラムにあるnullの数をカウント
# XXXにカラム名
df.XXX.isnull().sum()


# dfの中のNullを0に変換
df = df.replace(np.nan,0)

# dfの特定のカラムのNullを0に変換
# XXXにカラム名
df.XXX = df.XXX.replace(np.nan,0)

 

ざっくり統計値を確認

文字列と数値のカラムが混ざったりしていても、適当に考慮して省いてくれたりするので、手早くざっくり見たいときには重宝します。

df.describe()

 

特定のカラムの値でGroup Byして、集計関数を適用

こちらも、集計できないカラムは適当に省いてくれます。
sqlでできればそっちの方が早いし、そうすべきなのですが、手元にすでにDataFrameとしてあるデータをちゃちゃっと見たい時ってありますよね。

# 見たいカラムをXXXとして、

# 要素数のカウント
df.groupby('XXX').count()

# 合計
df.groupby('XXX').sum()

# 先ほどのdescribe()もあります
df.groupby('XXX').describe()

# その他 ここら辺になるとsqlで計算しよろって感じになりますが
df.groupby('XXX').first()
df.groupby('XXX').last()

# 複数のカラムでのGroup Byもできます
df.groupby(['XXX','YYY']).count()

 

jupyterでのDataFrame表示を省略させない

# 表示するカラム数をoptionメソッドで指定します
pd.options.display.max_columns = 300

 

pandasでグラフを描くときのTips

pandasでDataFrameとしてデータをインポートしてから、とりあえずグラフ化して分布を確認したいことがよくあります。
そのときに個人的によく使うコードをメモ。


細かい設定とかでビジュアル整えようと思ったら、いくらでも設定あるらしいのですが、実際にpythonでどこまで労力をかけて可視化を努力するかが問題なんですよね。

個人的には、pythonでの可視化は、ちゃんとしたデータの可視化というよりは、自分で分析の方針を立てるための事前調査とかのレベルで使ってます。つまり、細かいところにはあまりこだわらず、自分でデータの傾向が読み取れればそれでよいというレベル。
他人に共有したり、レポーティングしたりする場合は、pythonでのグラフも使いますが、必要に応じてtableauなどの別ルーツを使ったりもします。

大体、SQLでアクセスしたデータをDataFrameとしてpythonで読み込み、いろいろ可視化してみる(データの分布自体の可視化)→統計モデリング機械学習→結果をまた可視化(パラメータの分布を可視化)という感じです。


pd.DataFrame.plot()メソッド

まずは準備としてライブラリをインポートします。
※jupyter notebookで書くのを前提にしています。一応。
データは適当にDataFrameを作成。

In [1]: import matplotlib.pyplot as plt
        import pandas as pd
        import seaborn as sns
        sns.set_style('whitegrid')
        %matplotlib inline
        #ライブラリのインポートとか

In [2]: df_sample = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
        df_sample.columns = ['a','b','c']
        df_sample
        #適当なデータフレームを作成
out [2]: 
   a b c
ーーーーー
0| 1 2 3
1| 4 5 6
2| 7 8 9

 
DataFrameの一番簡単な可視化は、.plotメソッド。
デフォルトでは線グラフで描画されます。

df_sample.plot()

f:id:spitta8823:20170614015741p:plain
これだけで最低限の可視化は出来ます。

棒グラフ

何も考えずに棒グラフにしたい場合。

df_sample.plot(kind='bar')

f:id:spitta8823:20170614015755p:plain

ヒストグラム

値の度数分布を可視化したい場合。

df_sample.plot(kind='hist',bins=10)

引数binsに、分布をいくつに分解したいかを入力します。

 
また、ヒストグラムに関しては、matplotlib.pyplotを使って下記のような書き方もよくします。データによりますが、主にいくつかの系列別に分布を可視化したい場合に使います。
多少複雑になるので、DataFrameのメソッドを使うよりも小回りが効く感じです。

In [3]: df_sample = pd.DataFrame([[1,1,1,1,1,1,2,2,2,3,3,4,5,6,7,8,9,10,11,12],[1,1,1,1,1,2,2,2,3,3,3,4,5,6,7,8,9,10,11,12]])
        df_sample = df_sample.T
        df_sample.columns = ['a','b']
        df_sample
        #ヒストグラム的な適当なサンプルデータ
out[3]: 
   a b
ーーー
0| 1 1
1| 1 1
2| 1 1
3| 1 1
4| 1 1
5| 1 2
6| 2 2
7| 2 2
8| 2 3
9| 3 3
10| 3 3
...

In [4]: plt.hist(df_sample['a'], bins=12, alpha=0.2, histtype='stepfilled', color='r', range = (0, 12))
        plt.hist(df_sample['b'], bins=12, alpha=0.2, histtype='stepfilled', color='b', range = (0, 12))
        plt.xlabel('x_label')
        plt.ylabel('y_label')
        plt.title('Title')
        plt.legend(['a','b'])
        #matplotlib.pyplotで描画

plt.hitsでヒストグラムを描画して、引数として、alphaはグラフの透過度です。
plt.legend()では、系列と色の関係の説明を付けてます。

情報収集用ニュースサイト

最近、会社のチャットのスレッドに流す用のニュース情報を探すことが多いので、情報収集できるサイトをいくつか探してブックマークしているのですが、その紹介を。
データサイエンス系、物理系、科学系、ハードウェア系など色々スレッドはあって、実務と直接関係ない情報でも興味あればとりあえず流している感じです。ただ、特に最近は基礎科学の情報でも比較的すぐに実用化されることが多い(ような気がする)。技術の進歩が早いので、常に先端のトピックをキャッチアップしていることは結構必要だったりする(ような気がする)。
 
英語のサイトが多いのは、日本語のサイトに載る情報は大体誰かに先に情報提供されてしまうので、先に情報をキャッチアップしようとすると、必然的に英語ソースになってしまうからです。面白くてインパクトのある情報の提供合戦になっている感があります。
 

  • 物理学系

www.symmetrymagazine.org
 
 
http://physicstoday.scitation.org/journal/ptophysicstoday.scitation.org
 
 
www.quantamagazine.org
 
 
physicsworld.com
 
 

  • 科学全般系

www.sciencedaily.com
 
 

これらのニュースサイト以外に、主要な論文の要約速報的な情報が得られるサイトが欲しいのですが、専門性が高まるにつれて情報ソースが論文そのものになってしまうので、なかなか難しいですね。ジャーナル読めってことになるんでしょうが、ジャーナル、学会、大学を横断して最新の情報をサマってくれているようなサイトないもんでしょうかねぇ。
あとは、twitterで中の人を情報発信している人をフォローするのが一番近道かも。
情報収集の効率化は、常に課題です。