Python と NumPy と pandas の間のデータのやり取りを調べました

pandas を使うことが多かったのですが、少しだけ NumPy も使ってみたので、データのやり取りについて書いておきます。

環境

  • Python 3.5.2
  • pandas 0.22.0
  • NumPy 1.14.3

Jupyter Notebook を pip install jupyter でインストールしておきました。

pandas を pip install pandas でインストールしておきました。 NumPy も一緒にインストールされました。

list → ndarray → Series → ndarray → list

これ以降、一つのコードブロックを Jupyter Notebook の一つのセルに入力しながら進めます。

最初にモジュールを読み込みました。

import numpy as np
import pandas as pd
import random

次に Python の標準の list を作りました。

l = [random.randint(0, 9) for x in range(10)]
print(type(l))
l

結果です。

<class 'list'>

[4, 3, 2, 8, 2, 3, 8, 2, 5, 4]

意味はないですけれども、ランダムな値のリストにしました。 要素の数は 10 です。

list → ndarray

NumPy の ndaray にしました。

a = np.array(l)
print(type(a))
a

結果です。

<class 'numpy.ndarray'>

array([4, 3, 2, 8, 2, 3, 8, 2, 5, 4])

ndarray にできました。

ndarray → Series

pandas の Series にしました。

s = pd.Series(a)
print(type(s))
s

結果です。

<class 'pandas.core.series.Series'>

0    4
1    3
2    2
3    8
4    2
5    3
6    8
7    2
8    5
9    4
dtype: int64

Series にできました。

Series → ndarray

ndarray に戻しました。

a2 = s.values
print(type(a2))
a2

結果です。

<class 'numpy.ndarray'>

array([4, 3, 2, 8, 2, 3, 8, 2, 5, 4])

ndarray にできました。

ndarray → Series

list に戻しました。

l2 = a2.tolist()
print(type(l2))
l2

結果です。

<class 'list'>

[4, 3, 2, 8, 2, 3, 8, 2, 5, 4]

list にできました。

list → ndarray → DataFrame → ndarray → list

pandas の Series にしたのとあまり変わらないですけれども、今度は、 2 次元の list から pandas の DataFrame を作ってみます。

最初に Python の標準の list を作りました。

l3 = [[random.randint(0, 9), random.randint(0, 9)] for x in range(10)]
print(type(l3))
l3

結果です。

<class 'list'>

[[4, 2],
 [7, 1],
 [9, 3],
 [0, 7],
 [0, 7],
 [1, 9],
 [4, 4],
 [1, 3],
 [4, 5],
 [8, 5]]

10 行、 2 列の 2 次元のリストにしました。

list → ndarray

NumPy の ndarray にしました。

a3 = np.array(l3)
print(type(a3))
a3

結果です。

<class 'numpy.ndarray'>

array([[4, 2],
       [7, 1],
       [9, 3],
       [0, 7],
       [0, 7],
       [1, 9],
       [4, 4],
       [1, 3],
       [4, 5],
       [8, 5]])

ndarray にできました。

ndarray → DataFrame

pandas の DataFrame にしました。

df3 = pd.DataFrame(a3)
print(type(df3))
df3

結果です。

<class 'pandas.core.frame.DataFrame'>

	0 	1
0 	4 	2
1 	7 	1
2 	9 	3
3 	0 	7
4 	0 	7
5 	1 	9
6 	4 	4
7 	1 	3
8 	4 	5
9 	8 	5

DataFrame にできました。

DataFrame → ndarray

NumPy の ndarray に戻しました。

a4 = df3.values
print(type(a4))
a4

結果です。

<class 'numpy.ndarray'>

array([[4, 2],
       [7, 1],
       [9, 3],
       [0, 7],
       [0, 7],
       [1, 9],
       [4, 4],
       [1, 3],
       [4, 5],
       [8, 5]])

ndarray にできました。

ndarray → list

list に戻しました。

l4 = a4.tolist()
print(type(l4))
l4

結果です。

<class 'list'>

[[4, 2],
 [7, 1],
 [9, 3],
 [0, 7],
 [0, 7],
 [1, 9],
 [4, 4],
 [1, 3],
 [4, 5],
 [8, 5]]

list にできました。

Numpy と pandas

NumPy の ndarray を使っていて、次のような面倒さを感じました。

dropna

nan を取り除こうとしました。

NumPy

NumPy の ndarray で nan を取り除こうとすると次のようになるみたいです。

最初に ndarray を作りました。

a11 = np.array([1, 2, np.nan, 4, 5, np.nan, 7, 8, np.nan])
a11

結果です。

array([ 1.,  2., nan,  4.,  5., nan,  7.,  8., nan])

ndarray から nan を取り除きます。

a11[~np.isnan(a11)]

結果です。

array([1., 2., 4., 5., 7., 8.])

pandas

pandas の Series で nan を取り除こうとすると次のようになるみたいです。

最初に Series を作りました。

s11 = pd.Series(a11)
s11

結果です。

0    1.0
1    2.0
2    NaN
3    4.0
4    5.0
5    NaN
6    7.0
7    8.0
8    NaN
dtype: float64

Series から nan を取り除きます。

s11.dropna()

結果です。

0    1.0
1    2.0
3    4.0
4    5.0
6    7.0
7    8.0
dtype: float64

shift

要素をシフトしようとしました。

NumPy

NumPy の ndarray で shift しようとすると次のようになるみたいです。

numpy.roll もあるようでしたが、今回は空いたところに nan を入れたかったので使いませんでした。

shift = 2
np.concatenate((np.full(shift, np.nan), a11[:-shift])) if shift >= 0 else np.concatenate((a11[-shift:], np.full(-shift, np.nan)))

結果です。

array([nan, nan,  1.,  2., nan,  4.,  5., nan,  7.])

pandas

pandas の Series で shift しようとすると次のようになるみたいです。

pd.Series(a11).shift(2)

結果です。

0    NaN
1    NaN
2    1.0
3    2.0
4    NaN
5    4.0
6    5.0
7    NaN
8    7.0
dtype: float64

Gist のソース

Gist にソースをアップしました。

終わり

最初、たまたまその時に扱っていたデータの型が ndarray だったから、 Series.dropna や Series.shift を使えずに面倒なことをしようとしてしまっていました。 簡単に実現できる方法で実装したいです。

まだ覚えることが多いので少しずつやっていきます。