# データフレームからのデータの抽出

``````

In [1]:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series, DataFrame

``````

### DataFrame から特定の列を Series として取り出す例です。

``````

In [2]:

from numpy.random import randint
dices = randint(1,7,(5,2))
diceroll = DataFrame(dices, columns=['dice1','dice2'])
diceroll

``````
``````

Out[2]:

dice1
dice2

0
1
2

1
4
2

2
2
1

3
3
1

4
1
4

``````

``````

In [3]:

diceroll['dice1']

``````
``````

Out[3]:

0    1
1    4
2    2
3    3
4    1
Name: dice1, dtype: int64

``````

column 名を属性に指定して取り出します。

``````

In [4]:

diceroll.dice1

``````
``````

Out[4]:

0    1
1    4
2    2
3    3
4    1
Name: dice1, dtype: int64

``````

### 複数の列を DataFrame として取り出す例です。

``````

In [5]:

data = {'City': ['Tokyo','Osaka','Nagoya','Okinawa'],
'Temperature': [25.0,28.2,27.3,30.9],
'Humidity': [44,42,np.nan,62]}
cities = DataFrame(data)
cities

``````
``````

Out[5]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
NaN
27.3

3
Okinawa
62.0
30.9

``````
``````

In [6]:

cities[['City', 'Humidity']]

``````
``````

Out[6]:

City
Humidity

0
Tokyo
44.0

1
Osaka
42.0

2
Nagoya
NaN

3
Okinawa
62.0

``````

``````

In [7]:

cities[['City']]

``````
``````

Out[7]:

City

0
Tokyo

1
Osaka

2
Nagoya

3
Okinawa

``````

``````

In [8]:

cities['City']

``````
``````

Out[8]:

0      Tokyo
1      Osaka
2     Nagoya
3    Okinawa
Name: City, dtype: object

``````

### DataFrame から行を指定して取り出す例です。

``````

In [9]:

cities[0:2]

``````
``````

Out[9]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

``````
``````

In [10]:

cities[2:3]

``````
``````

Out[10]:

City
Humidity
Temperature

2
Nagoya
NaN
27.3

``````
``````

In [11]:

cities[1:]

``````
``````

Out[11]:

City
Humidity
Temperature

1
Osaka
42.0
28.2

2
Nagoya
NaN
27.3

3
Okinawa
62.0
30.9

``````

``````

In [12]:

cities[cities['Temperature']>28]

``````
``````

Out[12]:

City
Humidity
Temperature

1
Osaka
42.0
28.2

3
Okinawa
62.0
30.9

``````

### 行と列の両方を指定して取り出す例です。

``````

In [13]:

cities

``````
``````

Out[13]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
NaN
27.3

3
Okinawa
62.0
30.9

``````

``````

In [14]:

cities.ix[1:3, ['City','Humidity']]

``````
``````

Out[14]:

City
Humidity

1
Osaka
42.0

2
Nagoya
NaN

3
Okinawa
62.0

``````

### DataFrame の行ごとに処理をする例です。

``````

In [15]:

cities

``````
``````

Out[15]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
NaN
27.3

3
Okinawa
62.0
30.9

``````

iterrows メソッドは、各行の index とその行を表わす Series オブジェクトを順に返します。

``````

In [16]:

for index, line in cities.iterrows():
print 'Index:', index
print line, '\n'

``````
``````

Index: 0
City           Tokyo
Humidity          44
Temperature       25
Name: 0, dtype: object

Index: 1
City           Osaka
Humidity          42
Temperature     28.2
Name: 1, dtype: object

Index: 2
City           Nagoya
Humidity          NaN
Temperature      27.3
Name: 2, dtype: object

Index: 3
City           Okinawa
Humidity            62
Temperature       30.9
Name: 3, dtype: object

``````

### データフレームを変更する例です。

DataFrame から抽出したオブジェクトを変更する際は、明示的にコピーを作成します。

``````

In [17]:

humidity = cities['Humidity'].copy()
humidity[2] = 50
humidity

``````
``````

Out[17]:

0    44.0
1    42.0
2    50.0
3    62.0
Name: Humidity, dtype: float64

``````

コピーを変更しても元の DataFrame が変更されることはありません。

``````

In [18]:

cities

``````
``````

Out[18]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
NaN
27.3

3
Okinawa
62.0
30.9

``````

DataFrame の特定要素を変更する際は、loc メソッドで要素を指定します。

``````

In [19]:

cities.loc[2,'Humidity'] = 50
cities

``````
``````

Out[19]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
50.0
27.3

3
Okinawa
62.0
30.9

``````

30より大きい値の Temperature を30に揃える処理の例です。

``````

In [20]:

for index, line in cities.iterrows():
if line['Temperature'] > 30:
cities.loc[index, 'Temperature'] = 30
cities

``````
``````

Out[20]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.2

2
Nagoya
50.0
27.3

3
Okinawa
62.0
30.0

``````

``````

In [21]:

cities.loc[(cities['Temperature']>27)&(cities['Temperature']<29), 'Temperature'] = 28
cities

``````
``````

Out[21]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.0

2
Nagoya
50.0
28.0

3
Okinawa
62.0
30.0

``````

### dropna メソッドで欠損値を含む行を削除する例です。

``````

In [22]:

cities.loc[2,'Humidity'] = np.nan
cities

``````
``````

Out[22]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.0

2
Nagoya
NaN
28.0

3
Okinawa
62.0
30.0

``````
``````

In [23]:

cities = cities.dropna()
cities

``````
``````

Out[23]:

City
Humidity
Temperature

0
Tokyo
44.0
25.0

1
Osaka
42.0
28.0

3
Okinawa
62.0
30.0

``````

## 練習問題

(1) 次の関数 create_dataset() を用いて、num=10 個のデータからなるデータフレーム data を作成します。その後、iterrowsメソッドを利用して、データポイント (x,y) のy値と関数 sin(2πx) の平方根平均二乗誤差 √{sum(sin(2πx) - y)**2 / num} を計算してください。

ヒント：この例では、平方根平均二乗誤差は約0.3になります。

``````

In [24]:

from numpy.random import normal

def create_dataset(num):
data_x = np.linspace(0,1,num)
data_y = np.sin(2*np.pi*data_x) + normal(loc=0, scale=0.3, size=num)
return DataFrame({'x': data_x, 'y': data_y})

``````

(2) (1)のDataFrameから列 'x' だけを取り出したSeriesオブジェクトを変数 x に格納してください。nameプロパティは、'x' とします。

さらに、x**2 （各要素を2乗した値）を要素とするSeriesオブジェクトを作成して、変数 x2 に格納してください。nameプロパティは、'x2' とします。

(3) (2)で作成した x, x2, x3, x4 を結合して、x, x2, x3, x4を列に持ったDataFrame dataset を作成してください。

ヒント：結果は、次のような DataFrame になります。

``````

In [25]:

from PIL import Image
Image.open("figure01.png")

``````
``````

Out[25]:

``````