Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

(勉強会用資料)Python Pandas もくもく勉強会 in 新潟 #2

1. はじめに

新潟で Python Pandas もくもく勉強会 というものを主催しています。本記事はその 2019/08/04 に行われる勉強会で私が行う 5分LT の資料です。(資料置き場がないのでブログを活用しています)。1週間くらい Pandas を使ってみて、記憶に残っているものをまとめました。

connpass.com

2. import 文

import pandas as pd

3. Series または DataFrame の index を1始まりにする方法

3.1. Series の場合

3.1.1. 使用するデータ
data = ['a', 'b', 'c']
s = pd.Series(data)
s
#################
# In [392]: s   #
# Out[392]:     #
# 0    a        #
# 1    b        #
# 2    c        #
# dtype: object #
#################
3.1.2. 方法
'''index を指定しない場合、自動で 0 始まりのインデックスとなるので単に +1 すればよい'''
s.index += 1
s
#################
# In [89]: s    #
# Out[89]:      #
# 1    a        #
# 2    b        #
# 3    c        #
# dtype: object #
#################

3.2. DataFrame の場合

3.2.1. 使用するデータ
data = [['a', 'b', 'c'],
        ['d', 'e', 'f'],
        ['g', 'h', 'i']]
df = pd.DataFrame(data)
df
################
# In [397]: df #
# Out[398]:    #
#    0  1  2   #
# 0  a  b  c   #
# 1  d  e  f   #
# 2  g  h  i   #
################
3.2.2. 方法
'''(Series と同じ)index を指定しない場合、自動で 0 始まりのインデックスとなるので単に +1 すればよい'''
df.index += 1
df
################
# In [189]: df #
# Out[189]:    #
#    0  1  2   #
# 1  a  b  c   #
# 2  d  e  f   #
# 3  g  h  i   #
################

4. Series または DataFrame を比較して一致する行を探す

4.1. Series の場合

4.1.1. 使用するデータ
data = ['a', 'b', 'c']
data2 = ['a', 'x', 'c']
s = pd.Series(data)
s2 = pd.Series(data2)
s
s2
#################
# In [128]: s   #
# Out[128]:     #
# 0    a        #
# 1    b        #
# 2    c        #
# dtype: object #
#               #
# In [129]: s2  #
# Out[129]:     #
# 0    a        #
# 1    x        #
# 2    c        #
# dtype: object #
#################
4.1.2. 比較を行う
s3 = s==s2
s3
#################
# In [130]: s3  #
# Out[130]:     #
# 0     True    #
# 1    False    #
# 2     True    #
# dtype: bool   #
#################
4.1.3. フィルタリング
s4 = s[s3]
s4
################
# In [380]: s4 #
# Out[380]:    #
# 0    a       #
# 2    c       #
################

4.2. DataFrame の場合

4.2.1. 使用するデータ
data = [['a', 'b', 'c'],
        ['d', 'e', 'f'],
        ['g', 'h', 'i']]

data2 = [['a', 'b', 'c'],
         ['d', 'x', 'f'],
         ['g', 'h', 'i']]

df = pd.DataFrame(data)
df2 = pd.DataFrame(data2)
df
df2
#################
# In [227]: df  #
# Out[227]:     #
#    0  1  2    #
# 0  a  b  c    #
# 1  d  e  f    #
# 2  g  h  i    #
#               #
# In [228]: df2 #
# Out[228]:     #
#    0  1  2    #
# 0  a  b  c    #
# 1  d  x  f    #
# 2  g  h  i    #
#################
4.2.2. 一致する行を見つける方法
4.2.2.1. 比較
df3 = df==df2
df3
########################
# In [244]: df3        #
# Out[244]:            #
#       0      1     2 #
# 0  True   True  True #
# 1  True  False  True #
# 2  True   True  True #
########################
4.2.2.2.フィルタリング
# df と df2 で一致する行を抽出したい。
# df3 で全ての行が True の行のことなので、その行を抽出する
# all を使用するとできる
# all で reduce する方向は axis で決める、列方向に reduce するには axis=1 とする
# all は全ての行(観測点)に適用される
df4 = df3.all(axis=1)
df4
#################
# In [253]: df4 #
# Out[255]:     #
# 0     True    #
# 1    False    #
# 2     True    #
# dtype: bool   #
#################

# 以下のようにすると df と df2 の行において一致するの行だけ抽出できる
df5 = df[df4]
df5
#################
# In [280]: df5 #
# Out[280]:     #
#    0  1  2    #
# 0  a  b  c    #
# 2  g  h  i    #
#################
4.2.3. 一致しない行を見つける方法
4.2.3.1. 比較
df6 = df!=df2
df6
##########################
# In [288]: df6          #
# Out[288]:              #
#        0      1      2 #
# 0  False  False  False #
# 1  False   True  False #
# 2  False  False  False #
##########################
4.2.3.2. フィルタリング
# 注意!!: ひとつでも値が異なる行を見つけたいので、 all ではなく any を使用する
# (個人的にはまったのでメモ)
df7 = df6.any(axis=1)
df7
#################
# In [319]: df7 #
# Out[319]:     #
# 0    False    #
# 1     True    #
# 2    False    #
# dtype: bool   #
#################

df8 = df[df7]
df8
#################
# In [333]: df8 #
# Out[333]:     #
#    0  1  2    #
# 1  d  e  f    #
#################

# (Tips) 上記以外の書き方で、等価となる式
# 「"一致する行"でない行」を抽出
df9 = df[~df4]
df9
#################
# In [421]: df9 #
# Out[421]:     #
#    0  1  2    #
# 1  d  e  f    #
#################

5. np.full みたいに要素全てが同じ値からなる Series を作る方法

data = ['a']*5
s = pd.Series(data)
s
#################
# In [387]: s   #
# Out[387]:     #
# 0    a        #
# 1    a        #
# 2    a        #
# 3    a        #
# 4    a        #
# dtype: object #
#################