LoginSignup
1
1

More than 5 years have passed since last update.

python初心者のpandas勉強記録1~Seriesについて~

Last updated at Posted at 2018-05-08

1.はじめに

pandasについて勉強を始めました。基本的なところから押さえていこうと思います。

2.そもそもpandasとは?

wikipediaには次のように書いてありました:

Pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。特に、数表および時系列データを操作するためのデータ構造と演算を提供する。PandasはBSDライセンスのもとで提供されている。

よくわからないけど、データ解析をするにはあるととても便利なのでしょう。きっと。

3.使い方

基本的な使い方を押さえていきます。ただ、どうもpandasの機能はめちゃめちゃたくさんあるそうなので、おいおい追記していこうかと思います。

とにもかくにもまずはインポート:

import pandas as pd

①Series

pandasには、Seriesという型があるそうです。numpyの配列と密接に関連していることが後でわかります。

まずはインポートします:

from pandas import Series

Seriesの作り方とインデックス

Seriesでは、1次元の配列を作ることができます:

ser = Series([3,6,9,12])
ser
>>>0     3
   1     6
   2     9
   3    12
   dtype: int64

左側にはインデックス番号が振られていることがわかりますね。ここから値だけを取り出すには、values属性を使います:

ser.values
>>>array([ 3,  6,  9, 12], dtype=int64)

はい、ここでnumpyの配列が出てきました。Seriesとnumpyが密接に関係していることがうかがえます。

同じようにインデックスを参照するときはindex属性を用います:

ser.index
>>>RangeIndex(start=0, stop=4, step=1)

なんか変なのが出ましたが、意味は分かります。スライスと同じですね。

インデックスはもちろん自分で決めることができます:

ser = Series([1,2,3,4], index=["A", "B", "C", "D"])
ser
>>>A    1
   B    2
   C    3
   D    4
   dtype: int64

先ほどはインデックスに0から始まる数字が振られていましたが、見事に自分で決めたインデックスを付けることができています。

各データには、インデックスを使ってアクセスすることができます。また、大小比較などの条件を割り振ることもできます:

ser = Series([1,2,3,4], index=["A", "B", "C", "D"])
#インデックスでアクセス
ser["A"]
>>>1
#条件(numpyの配列でも似たことができる)
ser > 2
>>>A    False
   B    False
   C     True
   D     True
   dtype: bool
#Trueの部分の要素のみ取り出す
ser[ser > 2]
>>>C    3
   D    4
   dtype: int64

numpyで同じようなことを経験していればとっつきやすいかと思いますが、見ればなるほどなと思う操作ではないでしょうか。

Seriesと辞書

また、Seriesはpythonの辞書型のように使うこともできます。例えば、与えられた文字列がインデックスとして含まれているかどうかは、inを使えばいいのでした。Seriesでも使えます:

ser = Series([1,2,3,4], index=["A", "B", "C", "D"])
"A" in ser
>>>True
"F" in ser
>>>False

to_dict()メソッドを用いると、Seriesから辞書を作ることもできます。逆に、辞書からSeriesを作ることもできます:

ser = Series([1,2,3,4], index=["A", "B", "C", "D"])

#Seriesから辞書
ser.to_dict()
>>>{'A': 1, 'B': 2, 'C': 3, 'D': 4}

#辞書からSeries
dic = {"tanaka": 20, "yamashita": 30, "yoshida": 50}
ser = Series(dic)
>>>tanaka       20
   yamashita    30
   yoshida      50
   dtype: int64

言われてみれば似たような形をしているので、相互に変換できるのは何かと都合がよさそうですね。

さらにさらに、辞書からSeriesを作る際、インデックスを追加することができます:

dic = {"tanaka": 20, "yamashita": 30, "yoshida": 50}
member = ["tanaka", "yamashita", "yoshida", "nakamura"] #nakamuraを追加している
ser = Series(dic, index=member)
ser
>>>tanaka       20.0
   yamashita    30.0
   yoshida      50.0
   nakamura      NaN
   dtype: float64

元の辞書には"nakamura"という要素はないのでインデックスを追加しても、値はなしになっていますね。このことは、pandas.isnull関数でも確認できます:

pd.isnull(ser)
>>>tanaka       False
   yamashita    False
   yoshida      False
   nakamura      True
   dtype: bool

これも便利ですね。これと全く逆の結果になる関数でpandas.notnullというのもあります。参考までに。

Seriesのソート

ここでは、Seriesをソートする方法についてまとめておこうと思います。

その前に、説明の都合でnumpyを使いたいのでインポートしておきます:

from numpy.random import randn

まずは簡単なSeriesを作成しておきましょう:

ser = Series(randn(5), index = ["E", "C", "A", "B", "D"])
ser
>>>E   -0.511028
   C    0.100569
   A    0.834416
   B   -0.207201
   D   -2.755599
   dtype: float64

上ではあえてインデックスの順番をぐちゃぐちゃにしています。

インデックスについてソートするには、sort_indexメソッドが有効です:

ser.sort_index()
>>>A    0.834416
   B   -0.207201
   C    0.100569
   D   -2.755599
   E   -0.511028
   dtype: float64

インデックスがアルファベット順になりました。

また、値でソートする場合には、sort_valuesメソッドが有効です:

ser.sort_values()
>>>D   -2.755599
   E   -0.511028
   B   -0.207201
   C    0.100569
   A    0.834416
   dtype: float64

sort_valuesと合わせて押さえておきたいのが、rankというメソッドです。これは、「そのデータが小さいほうから何番目か」を数えてくれるメソッドです。実際に見てみましょう:

ser.rank()
>>>E    2.0
   C    4.0
   A    5.0
   B    3.0
   D    1.0
   dtype: float64

先ほどのsort_valuesの実行結果と見比べてみてください。例えば、インデックスDのデータは先頭に来ていたので、上で値が「1.0」になっていますね。

次回

ちょっと長くなってしまったので、3.使い方 の続きはまた別の記事にしようと思います。次はpandasでテーブルを操作する方法をまとめようと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1