Seriesの要素数・ユニーク数・Nullチェック・COUNTIFの再現

Seriesの長さを調べる

Seriesは.size.shapelen()で要素数をチェックできる

import pandas as pd
s = pd.Series([1,2,3,4,5])

print(s.size, type(s.size)) # 5 <class 'int'>
print(s.shape, type(s.shape)) # (5,) <class 'tuple'>
print(len(s), type(len(s))) # 5 <class 'int'>

ユニークな要素数を数える

  • series.is_unique:配列の要素がユニークかどうかを判定
  • series.nunique():ユニークな値の個数を返す
u1 = pd.Series([1,2,3,4,5])
print(u1.is_unique, type(u1.is_unique)) # True <class 'bool'>
print(u1.nunique(), type(u1.nunique())) # 5 <class 'int'>

u2 = pd.Series([1,1,2,3,3])
print(u2.is_unique, type(u2.is_unique)) # False <class 'bool'>
print(u2.nunique(), type(u2.nunique())) # 3 <class 'int'>

有効な要素数を数える

  • series.count():Series内で有効(=Noneや空欄じゃない)な要素数を返す
  • series.hasnans:Series内に無効(=Noneや空欄)な要素があったらTrueを返す
s = pd.Series([None,1,2,3,4,5,None])

print(s.size, type(s.size)) # 7 <class 'int'>
print(s.count(), type(s.count())) # 5 <class 'numpy.int64'>

print(s.hasnans, type(s.hasnans)) # True <class 'bool'>
  • series.notnull():有効な要素のBoolリストを返すので、それをsum()すれば有効な要素数の合計になる
  • series.notna():同上
s = pd.Series([None,1,2,3,4,5,None])

print(s.notnull().values) # [False  True  True  True  True  True  False]
print(s.notna().values) # [False  True  True  True  True  True  False]

print(s.notnull().sum()) # 5
print(s.notna().sum()) # 5

無効な要素数を数える

  • series.isnull():無効な要素のboolリストを返すので、それをsum()すれば無効な要素数の合計になる
s = pd.Series([None,1,2,3,4,5,None])

print(s.isnull().values) # [ True False False False False False  True]
print(s.isnull().sum(), type(s.isnull().sum())) # 2 <class 'numpy.int64'>

各要素の出現回数を数える(ExcelのCOUNTIFに相当)

公式:pandas.Series.value_counts

Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)

出現回数のカウント。デフォルトでは無効な値は自動的に除外する

s = pd.Series([3, 1, 2, 3, 4, None])
print(s.value_counts())
# 3.0    2
# 1.0    1
# 2.0    1
# 4.0    1
# Name: count, dtype: int64

dropna=Falseにすると無効な値もカウントする

s = pd.Series([3, 1, 2, 3, 4, None])
print(s.value_counts(dropna=False))
# 3.0    2
# 1.0    1
# 2.0    1
# 4.0    1
# NaN    1
# Name: count, dtype: int64

normalize=Trueにすると、全体を1とした割合を計算する

s = pd.Series([3, 1, 2, 3, 4, None])
print(s.value_counts(dropna=False, normalize=True))
# 3.0    0.333333
# 1.0    0.166667
# 2.0    0.166667
# 4.0    0.166667
# NaN    0.166667
# Name: proportion, dtype: float64

要素の並び替え

値のソート

公式:pandas.Series.sort_values

Series.sort_values(*, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)

パラメータ(よく使うものだけ太字)

  • axis:Seriesでは使わない。DataFrameオブジェクトで使うもの
  • ascending:Trueなら昇順、Falseなら降順
  • inplace;Trueにすると変更を保存する。Falseならコピーを返す
  • kind:ソートアルゴリズムを指定できる
  • na_position:firstかlastのみ。NA(無効な値)を先頭に置くか末尾に置くかの指定
  • ignore_index:Trueにするとソート後にindexをリセットする(indexが0, 1, ..., n-1 になる)
  • key:Pythonの標準関数sorted()と同じようにkey関数を渡すことができる
s = pd.Series([None, 1, 3, 10, 5])

print(s.sort_values())
# 1     1.0
# 2     3.0
# 4     5.0
# 3    10.0
# 0     NaN
# dtype: float64

ascending=Falseで降順

print(s.sort_values(ascending=False))
# 3    10.0
# 4     5.0
# 2     3.0
# 1     1.0
# 0     NaN
# dtype: float64

na_position='first'でNaNを先頭に、ignore_index=TrueでIndexをリセット

print(s.sort_values(ascending=False, na_position='first', ignore_index=True))
# 0     NaN
# 1    10.0
# 2     5.0
# 3     3.0
# 4     1.0
# dtype: float64

indexのソートもある:pandas.Series.sort_index

TOPランキングの取得

公式:pandas.Series.nlargest

Series.nlargest(n=5, keep='first')

n:TOP何件の要素を取得するか指定

keep:重複する要素がある時どうするかの指示

  • first : 重複する要素の中で最初に出現する要素を返す
  • last : 重複する要素の中で最後に出現する要素を返す
  • all : 重複するすべての要素を含める。指定したnより多くなる可能性あり
countries_population = {"Italy": 59000000, "France": 65000000,
                        "Malta": 434000, "Maldives": 434000,
                        "Brunei": 434000, "Iceland": 337000,
                        "Nauru": 11300, "Tuvalu": 11300,
                        "Anguilla": 11300, "Montserrat": 5200}
s = pd.Series(countries_population)

print(s.nlargest(3))
# France    65000000
# Italy     59000000
# Malta       434000
# dtype: int64

keep=allを使った場合

print(s.nlargest(3, keep='all'))
# France      65000000
# Italy       59000000
# Malta         434000
# Maldives      434000
# Brunei        434000
# dtype: int64

逆に最下位ランキングを作る「nsmallest」もある

print(s.nsmallest(3, keep='all'))
# Montserrat     5200
# Nauru         11300
# Tuvalu        11300
# Anguilla      11300
# dtype: int64

-Pandas, Python