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 を取り除こうとすると次のようになるみたいです。
- pandas.Series.dropna — pandas 0.23.0 documentation
- pandas.DataFrame.dropna — pandas 0.23.0 documentation
最初に 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 しようとすると次のようになるみたいです。
- pandas.Series.shift — pandas 0.23.0 documentation
- pandas.DataFrame.shift — pandas 0.23.0 documentation
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 を使えずに面倒なことをしようとしてしまっていました。 簡単に実現できる方法で実装したいです。
まだ覚えることが多いので少しずつやっていきます。