トップページに戻る

Pandas―データ分析(2)DataFrame

DataFrame

Seriesが一列だとすれば、DataFrameは複数の列を持つデータ構造をしています。
イメージとして、Excelのようなデータ構造をndarrayで保持しているというのが近いと思います。
一つ一つの要素を書き換えるような手動の処理はExcelの方が素早く出来ますが、一括計算をしたいときはDataFrameの方が遥かに素早く計算できます。

In [1]:
import pandas as pd

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
In [2]:
# 辞書型を引数にとり、DataFrameオブジェクトを返す。
df = pd.DataFrame(
    {
        "A": [1, 2, 3, -1],
        "B": ["apple", "orange", "banana", "apple"],
        "C": [False, True, True, True],
    }, index=list("abcd"))
df
Out[2]:
A B C
a 1 apple False
b 2 orange True
c 3 banana True
d -1 apple True
In [3]:
# DataFrameに含まれるSeriesのnameはcolumnsで参照できる
df.columns
Out[3]:
Index(['A', 'B', 'C'], dtype='object')
In [4]:
# columnsをキーワード引数で与える場合、インデックスごとのデータのリストを渡す
df = pd.DataFrame(
    [
        [1, "apple", False],
        [2, "orange", True],
        [3, "banana", True],
        [-1, "apple", True],
    ], columns=["A", "B", "C"])
df
Out[4]:
A B C
0 1 apple False
1 2 orange True
2 3 banana True
3 -1 apple True
In [5]:
# 各軸のdtypeを確認(NumPyのndarrayを保持している!)
df.dtypes
Out[5]:
A     int64
B    object
C      bool
dtype: object
In [6]:
# Seriesは属性のように呼び出せる
df.B # または df["B"]
Out[6]:
0     apple
1    orange
2    banana
3     apple
Name: B, dtype: object
In [7]:
# 複数の列を抜き出したDataFrameを作る
df[["A", "C"]]
Out[7]:
A C
0 1 False
1 2 True
2 3 True
3 -1 True
In [8]:
# Series 'C'の値がTrueのものだけをDataFrameとして抜き出す
df[df.C]
Out[8]:
A B C
1 2 orange True
2 3 banana True
3 -1 apple True
In [9]:
# Bがappleのものだけを抜き出す
df[df.B == "apple"]
Out[9]:
A B C
0 1 apple False
3 -1 apple True
In [10]:
# Bがappleかつ、CがTrueのものだけを抜き出す
df[(df.B == "apple") & df.C]
Out[10]:
A B C
3 -1 apple True
In [11]:
# DataFrameへのSeriesの追加はこのようにする
df["D_new"] = df.A ** 2
df
Out[11]:
A B C D_new
0 1 apple False 1
1 2 orange True 4
2 3 banana True 9
3 -1 apple True 1
In [12]:
# メソッドを呼ぶと列ごとに値を計算する
df.sum()
Out[12]:
A                             5
B        appleorangebananaapple
C                             3
D_new                        15
dtype: object
In [13]:
# DataFrameの統計量をまとめて出す
df = pd.DataFrame({"rand": (np.random.rand(1000) - 0.5).cumsum(),
                "randn": np.random.randn(1000).cumsum()})
df.describe()
Out[13]:
rand randn
count 1000.000000 1000.000000
mean 4.492801 3.731727
std 1.764634 8.823353
min 0.124222 -12.485269
25% 3.100176 -2.949801
50% 4.375967 1.950034
75% 5.490060 9.909272
max 9.052806 24.105080
In [14]:
# DataFrameのプロット:何も指定しないと各Seriesを重ねてプロットする
df.plot()
plt.show()
In [15]:
# ヒストグラムなどはkindで指定する。 「df.plot?」を見ると詳細あり。
df.plot(kind="hist", bins=50)
Out[15]:
<AxesSubplot:ylabel='Frequency'>

基礎編

応用編