1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Pandas使い方メモ

Last updated at Posted at 2020-01-27

#1 目的
Pandas,Numpyを使いデータ配列の操作を行う方法を記録しておく。

題名 リンク
【python】Pandasの使い方 LINK
【python】Pandas2の使い方 LINK
【python】Pandas3の使い方 LINK
【python】Pandas4の使い方 LINK
【python】Pandas5の使い方 LINK
【python】Pandas ,pythonコードメモ 6 LINK

#2 CVSデータを扱う

##2-1 CSVデータを読み取る

CSVファイルサンプル。列名が初めから含まれている。

/home/sampletest/sample.csv
DATE,CLOSE,OPEN,HIGH,LOW,VOL
2020-01-21,22720,23140,23150,22710,4729711
2020-01-22,23050,22670,23080,22670,3345936
2020-01-23,22600,22690,22840,22570,5629196

##2-2 CSVデータ読み取り(列名も一緒に読み出す)

CSVファイルを読み取るコード(CSVファイルの列名も一緒に読み出す)

/home/sampletest/sample.py
import pandas as pd
#index_col=0は列名もデータと一緒に取り出す。
matrix= pd.read_csv("sample.csv", index_col=0) 
print(matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py

#DATEがindexとなっている。
            CLOSE   OPEN   HIGH    LOW      VOL
DATE
2020-01-21  22720  23140  23150  22710  4729711
2020-01-22  23050  22670  23080  22670  3345936
2020-01-23  22600  22690  22840  22570  5629196

##2-3 CSVデータ読み取り(indexを日付型に変換する)

/home/sampletest/sample.py
import pandas as pd
matrix= pd.read_csv("sample.csv",encoding='utf-8',parse_dates=True) #index_col=0は列名もデータと一緒に取り出す。
print(matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
            CLOSE   OPEN   HIGH    LOW      VOL
DATE
2020-01-21  22720  23140  23150  22710  4729711
2020-01-22  23050  22670  23080  22670  3345936
2020-01-23  22600  22690  22840  22570  5629196

##2-4 CSVデータ読み取り、列名を設定する。

サンプルデータ。列名が付与されていない。

/home/sampletest/sample.csv
2020-01-21,22720,23140,23150,22710,4729711
2020-01-22,23050,22670,23080,22670,3345936
2020-01-23,22600,22690,22840,22570,5629196
/home/sampletest/sample.py
import pandas as pd
#names=["x","xx",・・・]は列名を付与する。
matrix= pd.read_csv("sample.csv", names=["DATE","CLOSE","OPEN","HIGH","LOW","VOL"]) 
print(matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
         DATE  CLOSE   OPEN   HIGH    LOW      VOL
0  2020-01-21  22720  23140  23150  22710  4729711
1  2020-01-22  23050  22670  23080  22670  3345936
2  2020-01-23  22600  22690  22840  22570  5629196

##2-5 CSVデータ読み取り、INDEX列を指定する。

サンプルデータ

/home/sampletest/sample.csv
2020-01-21,22720,23140,23150,22710,4729711
2020-01-22,23050,22670,23080,22670,3345936
2020-01-23,22600,22690,22840,22570,5629196
/home/sampletest/sample.py
import pandas as pd

#index_col=0は、最左列をindexに設定する。
#parse_dates=Trueはindexを日付型に変換する。
matrix= pd.read_csv("sample.csv", index_col=0,parse_dates=True,names=["DATE","CLOSE","OPEN","HIGH","LOW","VOL"])
print(matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
            CLOSE   OPEN   HIGH    LOW      VOL
DATE
2020-01-21  22720  23140  23150  22710  4729711
2020-01-22  23050  22670  23080  22670  3345936
2020-01-23  22600  22690  22840  22570  5629196

##2-6 配列データをCSVファイルに書き出す。

/home/sampletest/test.py
df_ichimokumat.to_csv("test.csv")

#3 行列を作成する。

##3-1 列名を持つすべて0の行列を作成する。

/home/sampletest/sample.py
import pandas as pd

matrix = pd.DataFrame(0,index=["2020-1-28","2020-1-29"], columns=['CLOSE', 'OPEN', 'HIGH', 'LOW', 'VOL'])
matrix.index.name = "DATE" #index列に名前をつける。
print(matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
           CLOSE  OPEN  HIGH  LOW  VOL
DATE
2020-1-28      0     0     0    0    0
2020-1-29      0     0     0    0    0

##3-2 空の列を追加し、追加した列にデータを配置する

/home/sampletest/sample.py
import pandas as pd
import numpy as np

#一旦マトリックスを作成する。
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]},
                  index=['ONE', 'TWO', 'THREE'])
print(df)

#空データの列'D', 列'E'を加える。
df=pd.DataFrame(df,columns=['A', 'B', 'C', 'D', 'E'])
print(df)

#列'D'にデータを配置する。
df['D']=[9,10,11]

print(df)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
#一旦マトリックスを作成する。
       A  B  C
ONE    1  4  7
TWO    2  5  8
THREE  3  6  9

#空データの列'D', 列'E'を加える。
       A  B  C   D   E
ONE    1  4  7 NaN NaN
TWO    2  5  8 NaN NaN
THREE  3  6  9 NaN NaN

#'D'にデータを配置する。
       A  B  C   D   E
ONE    1  4  7   9 NaN
TWO    2  5  8  10 NaN
THREE  3  6  9  11 NaN

##3-3 データを定義し、行列を生成する。(その1)

/home/sampletest/sample.py
import pandas as pd
import numpy as np

#一旦マトリックスを作成する。
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]},
                  index=['ONE', 'TWO', 'THREE'])
print(df)

#空データの列'D', 列'E'を加える。
df=pd.DataFrame(df,columns=['A', 'B', 'C', 'D', 'E'])
print(df)

#列'D'にデータを配置する。
df['D']=[9,10,11]

print(df)

実行結果

       A  B  C
ONE    1  4  7
TWO    2  5  8
THREE  3  6  9
       A  B  C   D   E
ONE    1  4  7 NaN NaN
TWO    2  5  8 NaN NaN
THREE  3  6  9 NaN NaN
       A  B  C   D   E
ONE    1  4  7   9 NaN
TWO    2  5  8  10 NaN
THREE  3  6  9  11 NaN

##3-4 データを定義し、行列を生成する。(その2)

/home/sampletest/sample.py
import pandas as pd
import numpy as np
dat = [
    ['2019-07-01','9997','740'],
    ['2019-07-02','9997','749'],
    ['2019-07-03','9997','757'],
    ['2019-07-04','9997','769'],
    ['2019-07-05','9997','762'],
    ['2019-07-08','9997','760']
]
df4 = pd.DataFrame(dat,columns=["A","B","C"])
print(df4)

実行結果

            A     B    C
0  2019-07-01  9997  740
1  2019-07-02  9997  749
2  2019-07-03  9997  757
3  2019-07-04  9997  769
4  2019-07-05  9997  762
5  2019-07-08  9997  760

##3-5 2行2列の乱数(正規分布)を作成する。

/home/sampletest/sample.py
import pandas as pd
import numpy as np
mean=[0,0] #2次元正規分布の平均を指定する。
cov=[[1,0],[0,10]] #2次元正規分布の分散を指定する。

#平均mean,分散covに従う2次元正規分布に従う乱数を指定する。
dset=np.random.multivariate_normal(mean,cov,1000)
#dsetをDataFrameに格納する。
df=pd.DataFrame(dset,columns=['X','Y'])
print(df)

実行結果

            X         Y
0   -0.632174  1.316482
1    1.298250 -2.004519
2   -1.289775 -9.468985
3    1.107289  2.853592
4   -1.104606 -1.400572
..        ...       ...
995 -1.975120 -4.199171
996 -0.022915 -0.861581
997  0.198733 -1.256023
998 -1.410785  0.127125
999  0.945026 -5.554634

[1000 rows x 2 columns]

#4 演算処理

##4-1 n番目のデータとn-1番目のデータの変化率を算出する。(欠損データ処理も行う)

/home/sampletest/sample.py
import pandas as pd

#CSVファイルからデータを読み取る。
matrix= pd.read_csv("sample.csv", index_col=0,parse_dates=True,names=["DATE","CLOSE","OPEN","HIGH","LOW","VOL"])
print(matrix)

#n番目のデータとn-1番目のデータの変化率を算出する。
ptc_matrix=matrix.pct_change()
print(ptc_matrix)

#欠損データを削除する。
ptc_matrix=ptc_matrix.dropna()
print(ptc_matrix)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
            CLOSE   OPEN   HIGH    LOW      VOL
DATE
2020-01-21  22720  23140  23150  22710  4729711
2020-01-22  23050  22670  23080  22670  3345936
2020-01-23  22600  22690  22840  22570  5629196

#n番目のデータとn-1番目のデータの変化率を算出する。
               CLOSE      OPEN      HIGH       LOW       VOL
DATE
2020-01-21       NaN       NaN       NaN       NaN       NaN
2020-01-22  0.014525 -0.020311 -0.003024 -0.001761 -0.292571
2020-01-23 -0.019523  0.000882 -0.010399 -0.004411  0.682398

#欠損データを削除する。
               CLOSE      OPEN      HIGH       LOW       VOL
DATE
2020-01-22  0.014525 -0.020311 -0.003024 -0.001761 -0.292571
2020-01-23 -0.019523  0.000882 -0.010399 -0.004411  0.682398

##4-2 各列の平均と分散を計算する

/home/sampletest/sample.py
import pandas as pd
import numpy as np

#CSVファイルからデータを読み取る。
matrix= pd.read_csv("sample.csv", index_col=0,parse_dates=True,names=["DATE","CLOSE","OPEN","HIGH","LOW","VOL"])
print(matrix)

sigma = np.std(matrix)   #各列の分散を計算する
mean=np.mean(matrix)    #各列の平均を計算する

print(sigma)
print(mean)

実行結果

root@2a1627805ea9:/home/sampletest# python3 sample.py
            CLOSE   OPEN   HIGH    LOW      VOL
DATE
2020-01-21  22720  23140  23150  22710  4729711
2020-01-22  23050  22670  23080  22670  3345936
2020-01-23  22600  22690  22840  22570  5629196

#各列のshigma値を計算
CLOSE       190.262976
OPEN        216.999744
HIGH        132.748718
LOW          58.878406
VOL      939100.204300
dtype: float64

#各列の平均値を計算
CLOSE    2.279000e+04
OPEN     2.283333e+04
HIGH     2.302333e+04
LOW      2.265000e+04
VOL      4.568281e+06
dtype: float64

##4-2 各列のデータを正規化する。

正規化とは詳しくはこちら
今回の実施例は、scipy.stats.zscore()関数を使用している。平均0、分散1に正規化(標準化)する

/home/sampletest/sample.py
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns
import io
import sys
import numpy as np
import scipy.stats
import pandas as pd

COLUMUNS=['A','B','C'] #描写するデータフレームの列名を与える
INDEX='DATE' #描写するデータフレームのindex値を与える。


#データフレームdf0を定義する
df0 = pd.DataFrame({'DATE': [1, 2, 3, 4],
                    'A': [12, -5, 3,6],
                    'B': [21, 17, 12,8],
                    'C': [6, -2, 0,9]
                   })

df0.set_index("DATE",inplace=True) #DATE列をindexに指定する

print(df0)

df1=seikika(df0,INDEX,COLUMUNS) #データフレームdf0を列ごとに正規化する。

print(df1)

#生データを正規化する
def seikika(matrix,INDEX,COLUMNS): #matrix:データセット, INDEX:matrixのindex値, COLUMNS:matrixの列名

    z_matrix=scipy.stats.zscore(matrix) #各列においてデータを正規化する。リスト形式で返される
    z_matrix=pd.DataFrame(z_matrix,columns=COLUMUNS) #リスト形式をデータフレーム形式に変換する。
    matrix.reset_index(INDEX,inplace=True) #matrixのINDEX指定を解除
    z_matrix=pd.concat([matrix[INDEX],z_matrix ],axis=1) #正規化データとINDEX値を結合する
    z_matrix.set_index(INDEX,inplace=True)  #INDEXを再びindex指定する
    return z_matrix

実行結果

データ正規化処理前
       A   B  C
DATE           
1     12  21  6
2     -5  17 -2
3      3  12  0
4      6   8  9
データ正規化処理後
             A         B         C
DATE                              
1     1.306395  1.319950  0.619780
2    -1.469694  0.507673 -1.183216
3    -0.163299 -0.507673 -0.732467
4     0.326599 -1.319950  1.295903

##4-3 各列のデータの重相関をとる。

/home/sampletest/sample.py
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns
import pandas as pd
import numpy as np

# Dataセットを定義する。(日付はdatetime.datetimeで記載する。日付型で表記する)
dat = [
    [datetime.datetime(2020,1,1),4,2],
    [datetime.datetime(2020,1,2),7,5],
    [datetime.datetime(2020,1,3),10,8],
    [datetime.datetime(2020,1,4),13,10],
    [datetime.datetime(2020,1,5),17,15],
    [datetime.datetime(2020,1,6),12,10],
    [datetime.datetime(2020,1,7),9,6],
    [datetime.datetime(2020,1,8),7,4],
    [datetime.datetime(2020,1,9),5,2],
    [datetime.datetime(2020,1,10),3,1],
    
    
]

dat=pd.DataFrame(dat,columns=["DATE","Y","Z"]) #リスト型データをDataFrame型に入れる。
dat.set_index("DATE",inplace=True) #横軸に表示する日付をDataFrameのindexにする。
print(dat)

print("\n")

print("Y列とZ列のデータの重相関をとる")
np.corrcoef(dat['Y'],dat['Z'])

実行結果

             Y   Z
DATE              
2020-01-01   4   2
2020-01-02   7   5
2020-01-03  10   8
2020-01-04  13  10
2020-01-05  17  15
2020-01-06  12  10
2020-01-07   9   6
2020-01-08   7   4
2020-01-09   5   2
2020-01-10   3   1


Y列とZ列のデータの重相関をとる
array([[1.        , 0.99324975],
       [0.99324975, 1.        ]])

#5 配列データ処理

##5-1 特定列を抽出する

Indexを指定し、対象配列から特定業を抽出する

/home/sampletest/sample.py
CSV_FILEPATH='test.csv'
matrix= pd.read_csv(CSV_FILEPATH) 
print("matrix" + "\n")            
print(matrix)
print("\n")
print("matrix1行目抽出"+ "\n") 
print(len(matrix['CODE']))
print("\n")
print("matrix1行目EPS列の要素を抽出"+ "\n") 
print(matrix.iloc[1]['EPS'])

実行結果

mtrix
       EPS  HAITOUB
CODE               
2152  71.5     14.0
7752  85.6     26.0
3657  54.0     12.0
4238  89.0     20.0


mtrix_pj
EPS        71.5
HAITOUB    14.0
Name: 2152, dtype: float64

##5-2 行番号を指定して抽出する

下記のコードは対象の配列の1行目を抽出することを行っている

/home/sampletest/sample.py
CSV_FILEPATH='test.csv'
matrix= pd.read_csv(CSV_FILEPATH, index_col=0) 
print("matrix" + "\n")            
print(matrix)
print("\n")
print("matrix1行目抽出"+ "\n") 
print(matrix.iloc[1])
print("\n")
print("matrix1行目EPS列の要素を抽出"+ "\n") 
print(matrix.iloc[1]['EPS'])
print("\n")
print("matrix3-4行目抽出"+ "\n") 
print(matrix.iloc[2:4])

print("matrix12,4列目抽出"+ "\n") 
print(matrix.iloc[:,[1,2,4]])

実行結果

matrix

       EPS  HAITOUBCODE         
CODE                            
2152  71.5                  14.0
7752  85.6                  26.0
3657  54.0                  12.0
4238  89.0                  20.0


matrix1行目抽出

EPS                     85.6
HAITOUBCODE             26.0
Name: 7752, dtype: float64


matrix1行目EPS列の要素を抽出

85.6


matrix3-4行目抽出

       EPS  HAITOUBCODE         
CODE                            
3657  54.0                  12.0
4238  89.0                  20.0

##5-3 2つの行列を横方向に結合する。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

df0 = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]},
                  index=[1, 2, 3])
print(df0)

df1 = pd.DataFrame({'D': [10, 11, 12],
                   'E': [13, 14, 15]},
                  index=[1, 2, 4])
print(df1)

#行列df0とdf1を横方向に結合する(横方向結合 axis=1)
dfc=pd.concat([df0, df1],axis=1)

print(dfc)

実行結果

df0
   A  B  C
1  1  4  7
2  2  5  8
3  3  6  9

df1
    D   E
1  10  13
2  11  14
4  12  15

df0とdf1の結合
     A    B    C     D     E
1  1.0  4.0  7.0  10.0  13.0
2  2.0  5.0  8.0  11.0  14.0
3  3.0  6.0  9.0   NaN   NaN
4  NaN  NaN  NaN  12.0  15.0

結合メモ
http://sinhrks.hatenablog.com/entry/2015/01/28/073327

##5-4 2つの行列を縦方向に結合する。

/home/sampletest/sample.py
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'D': [10, 11, 12],
                   'E': [13, 14, 15]},
                  index=[1, 2, 4])

df2= pd.DataFrame({'D': [0],
                   'E': [0]},
                  index=[5])

dfc=pd.concat([df1, df2])

実行結果

df1
    D   E
1  10  13
2  11  14
4  12  15
df2
   D  E
5  0  0
dfc
    D   E
1  10  13
2  11  14
4  12  15
5   0   0

##5-5 特定の行のみを1段下にシフトする。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

df1 = pd.DataFrame({'D': [10, 11, 12],
                   'E': [13, 14, 15]},
                  index=[1, 2, 4])

df2= pd.DataFrame({'D': [0],
                   'E': [0]},
                  index=[5])

#df1とdf2を縦に結合。つまり、最下位列にダミーを作る。
dfc=pd.concat([df1, df2]) 

#D行を一列下に移動する。+ E列と結合作業を行う
df3=pd.concat([dfc['D'].shift(1),dfc['E']],axis=1)

実行結果

df1
    D   E
1  10  13
2  11  14
4  12  15
df2
   D  E
5  0  0
dfc
    D   E
1  10  13
2  11  14
4  12  15
5   0   0
df3
      D   E
1   NaN  13
2  10.0  14
4  11.0  15
5  12.0   0

##5-6 列名を付与する

/home/sampletest/sample.py
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'D': [10, 11, 12],
                   'E': [13, 14, 15]},
                  index=[1, 2, 4])
print("df1")
print(df1)

#df1から'D'列を抽出する。ただし抽出後のデータdf2は列ラベル'D'がなくなる。
df2 = df1['D']

print("df2")
print(df2)

#列ラベル'D'を復活させる。
df3 = pd.DataFrame(df2,columns=['D'])

print("df3")
print(df3)

実行結果


df1
    D   E
1  10  13
2  11  14
4  12  15
df2
1    10
2    11
4    12
Name: D, dtype: int64
df3
    D
1  10
2  11
4  12

##5-8 列または行データを削除する

/home/sampletest/sample.py
import pandas as pd
import numpy as np

#一旦マトリックスを作成する。
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]},
                  index=['ONE', 'TWO', 'THREE'])
print(df)

df1=df.drop(columns='A') #列Aを削除する。

print("列Aを削除した")
print(df1)

df2=df.drop(index='ONE') #indexを指定して行を削除する。

print("indexを指定して行を削除した")
print(df2)

実行結果

       A  B  C
ONE    1  4  7
TWO    2  5  8
THREE  3  6  9
列Aを削除した
       B  C
ONE    4  7
TWO    5  8
THREE  6  9
indexを指定して行を削除した
       A  B  C
TWO    2  5  8
THREE  3  6  9

##5-9 条件に合うデータを抽出する。

/home/sampletest/sample.py
import pandas as pd


#DataFrameを定義する。
df = pd.DataFrame(
    {'ID':[1,2,3,],
     '名前':['中村','井上','鈴木'], 
     '居住県':['東京','山口','大阪']
    })




#'名前'列をIndexに指定する。
df.set_index("ID",inplace=True) 

print("dfを表示する")
print(df)

print("DataFrame dfから名前が「井上」に一致する行のみを取り出す")
df0 = df[df.名前==str('井上')]

print(df0) 

print("「井上」の居住県を取得する。")
print(df0.iloc[0][1])


print("DataFrame dfから名前が「井上」,「鈴木」に一致する行のみを取り出す")

names=['井上','鈴木']

#空のDataFrame df1を用意する。
df1 = pd.DataFrame(0,index=[],columns=['ID', '名前', '居住県'])
df1.set_index("ID",inplace=True) 

for i,j in enumerate(names):

    df1=pd.concat([df1, df[df.名前==str(j)]])

print(df1)

実行結果

(1)dfを表示する
    名前 居住県
ID        
1   中村  東京都
2   井上  山口県
3   鈴木  大阪府

(2)DataFrame dfから名前が「井上」に一致する行のみを取り出す。
→ DataFrame : df0に格納している。
    名前 居住県
ID        
2   井上  山口県

(3)「井上」の居住県を取得する。
山口県

(解説) DataFrame df0では、山口県は0行1列に存在しているため「df0.iloc[0][1]」と記述する。


DataFrame dfから名前が「井上」,「鈴木」に一致する行のみを取り出す
    名前 居住県
ID        
2   井上  山口
3   鈴木  大阪

##5-11 DataFrameのデータを昇順に並べる。

/home/sampletest/sample.py
import numpy as np
import pandas as pd


dat = [
    ['2019-07-01',10],
    ['2019-07-02',2],
    ['2019-07-03',6],
    ['2019-07-04',8],
    ['2019-07-05',15],
    ['2019-07-08',7]
]
df0 = pd.DataFrame(dat,columns=["A","B"])

print("df0")
print(df0)

#B列をKeyにしてデータを昇順に並べる。
df1=df0.sort_values(by=["B"], ascending=True)
print("df1")
print(df1)

実行結果

df0
            A   B
0  2019-07-01  10
1  2019-07-02   2
2  2019-07-03   6
3  2019-07-04   8
4  2019-07-05  15
5  2019-07-08   7
df1
            A   B
1  2019-07-02   2
2  2019-07-03   6
5  2019-07-08   7
3  2019-07-04   8
0  2019-07-01  10
4  2019-07-05  15

##5-12 DataFrameのデータを行番号を指定して取り出す。

/home/sampletest/sample.py
import numpy as np
import pandas as pd


dat = [
    ['2019-07-01',10],
    ['2019-07-02',2],
    ['2019-07-03',6],
    ['2019-07-04',8],
    ['2019-07-05',15],
    ['2019-07-08',7]
]
df0 = pd.DataFrame(dat,columns=["A","B"])

print("df0")
print(df0)

dataleng=df0["B"].count()

print("1行目(@B列)のデータを取得する")
print(df0["B"].iloc[0])
print("末行目(@B列)のデータを取得する")
print(df0["B"].iloc[dataleng-1]) 

実行結果


df0
            A   B
0  2019-07-01  10
1  2019-07-02   2
2  2019-07-03   6
3  2019-07-04   8
4  2019-07-05  15
5  2019-07-08   7
1行目(@B列)のデータを取得する
10
末行目(@B列)のデータを取得する
7

##5-13 1条件(if)に従い行データを生成する。

/home/sampletest/sample.py
import numpy as np
import pandas as pd

#サンプルデータの定義
dat = [
    ['2019-07-01',10],
    ['2019-07-02',2],
    ['2019-07-03',6],
    ['2019-07-04',8],
    ['2019-07-05',15],
    ['2019-07-08',7]
]


df0 = pd.DataFrame(dat,columns=["A","B"])

#条件判定結果を格納する列"C"を用意する。
df0 = pd.DataFrame(df0,columns=["A","B","C"])

print(df0)

#条件判定関数を定義する。
def judge(x):
    return 1 if x > 5 else 0

#B列の値>5であればC列は1を入力する。そうでなければC列は0にする。
df0['C'] = df0['B'].apply(judge)
                                
print(df0)

実行結果


            A   B   C
0  2019-07-01  10 NaN
1  2019-07-02   2 NaN
2  2019-07-03   6 NaN
3  2019-07-04   8 NaN
4  2019-07-05  15 NaN
5  2019-07-08   7 NaN

B列の値>5であればC列は1を入力する。そうでなければC列は0にする。
            A   B  C
0  2019-07-01  10  1
1  2019-07-02   2  0
2  2019-07-03   6  1
3  2019-07-04   8  1
4  2019-07-05  15  1
5  2019-07-08   7  1

##5-14 複数列データを比較し、比較結果により行データを生成する。

/home/sampletest/sample.py
import numpy as np
import pandas as pd

#サンプルデータの定義
dat = [
    [1,10],
    [4,2],
    [7,6],
    [4,8],
    [20,15],
    [3,7]
]


df0 = pd.DataFrame(dat,columns=["A","B"])

#条件判定結果を格納する列"C"を用意する。
df0 = pd.DataFrame(df0,columns=["A","B","C"])

print(df0)

#条件判定関数を定義する。
def judge(x):
    return 1 if x.A > x.B else 0


#B列の値>5であればC列は1を入力する。そうでなければC列は0にする。

df0['C'] = df0.apply(lambda x:judge(x),axis=1)
print("(A列データ)>(B列データ)あればC列は1を入力する。そうでなければC列は0にする。")                               
print(df0)

実行結果


    A   B   C
0   1  10 NaN
1   4   2 NaN
2   7   6 NaN
3   4   8 NaN
4  20  15 NaN
5   3   7 NaN
(A列データ)>(B列データ)あればC列は1を入力する。そうでなければC列は0にする。
    A   B  C
0   1  10  0
1   4   2  1
2   7   6  1
3   4   8  0
4  20  15  1
5   3   7  0

##5-15 3次元DataFrameを扱う(Panel)

##5-16 辞書型配列に順番を持たせる(OrderedDict)

##5-17 DataFrameのIndex名と列名を変更する。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

dat = [
    ['2019-07-01','9997','740'],
    ['2019-07-02','9997','749'],
    ['2019-07-03','9997','757'],
    ['2019-07-04','9997','769'],
    ['2019-07-05','9997','762'],
    ['2019-07-08','9997','760']
]



df4 = pd.DataFrame(dat,columns=["DATE","B","C"]) #各列に対して、列名を与えている。
df4.set_index("DATE",inplace=True) #DATE列をindexに指定する。

print("変更前")
print(df4)


df4.reset_index("DATE",inplace=True)  #DATE列のindexを解除する。


df4= df4.rename(columns={'DATE': 'Date','B': 'B1', 'C': 'C1'})#各列名を所望の列名に変更する。
df4.set_index("Date",inplace=True) 

print("変更後")
print(df4)


実行結果

変更前
               B    C
DATE                 
2019-07-01  9997  740
2019-07-02  9997  749
2019-07-03  9997  757
2019-07-04  9997  769
2019-07-05  9997  762
2019-07-08  9997  760
変更後
              B1   C1
Date                 
2019-07-01  9997  740
2019-07-02  9997  749
2019-07-03  9997  757
2019-07-04  9997  769
2019-07-05  9997  762
2019-07-08  9997  760
  

##5-18 DataFrameの列を入れ替える

/home/sampletest/sample.py
import numpy as np
import pandas as pd


dat = [
    ['2019-07-01',10,-2],
    ['2019-07-02',2,-5],
    ['2019-07-03',6,-10],
    ['2019-07-04',8,-8],
    ['2019-07-05',15,-6],
    ['2019-07-08',7,-8]
]
df0 = pd.DataFrame(dat,columns=["A","B","C"])

print("df0")
print(df0)

#列Bと列Cを入れ替える。
df0 = df0[['A','C','B']]
print("df0")
print(df0)

実行結果

df0
            A   B   C
0  2019-07-01  10  -2
1  2019-07-02   2  -5
2  2019-07-03   6 -10
3  2019-07-04   8  -8
4  2019-07-05  15  -6
5  2019-07-08   7  -8

df0 #列Bと列Cを入れ替える。
            A   C   B
0  2019-07-01  -2  10
1  2019-07-02  -5   2
2  2019-07-03 -10   6
3  2019-07-04  -8   8
4  2019-07-05  -6  15
5  2019-07-08  -8   7
  

##5-19 DataFrameの任意の列を取り出す。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

dat = [
    ['2019-07-01','9997','740'],
    ['2019-07-02','9997','749'],
    ['2019-07-03','9997','757'],
    ['2019-07-04','9997','769'],
    ['2019-07-05','9997','762'],
    ['2019-07-08','9997','760']
]



df4 = pd.DataFrame(dat,columns=["DATE","B","C"]) #各列に対して、列名を与えている。
print(df4)

df=df4.loc[:,['B','C']]
print(df)

実行結果

df4
         DATE     B    C
0  2019-07-01  9997  740
1  2019-07-02  9997  749
2  2019-07-03  9997  757
3  2019-07-04  9997  769
4  2019-07-05  9997  762
5  2019-07-08  9997  760

df(データフレームdf4から B列とC列を取り出す)
      B    C
0  9997  740
1  9997  749
2  9997  757
3  9997  769
4  9997  762
5  9997  760
  

##5-20 DataFrameをArrayにする。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

#一旦マトリックスを作成する。
df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [4, 5, 6],
                   'C': [7, 8, 9]},
                  index=['ONE', 'TWO', 'THREE'])

print("df")
print(df)

print("df.values")
df.values

実行結果


****df*****
       A  B  C
ONE    1  4  7
TWO    2  5  8
THREE  3  6  9

****df.values*****
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]], dtype=int64)
  

##5-21 List型のプロパティーと要素を取得する

/home/sampletest/sample.py
d = {'英語': 59, '数学': 76, '国語': 43}

print(d.values())   # dict_values([59, 76, 43])
print(d.keys())     # dict_keys(['英語', '数学', '国語'])

##5-22 Indexをキーにして2つのデータフレームを結合する。

重複したIndexは上書きする。

/home/sampletest/sample.py
import pandas as pd
import numpy as np

dat = [
    ['2019-07-01','9997','740'],
    ['2019-07-02','9997','749'],
    ['2019-07-03','9997','757'],
    ['2019-07-04','9997','769'],
    ['2019-07-05','9997','762'],
    ['2019-07-08','9997','760']
]
df0 = pd.DataFrame(dat,columns=["A","B","C"])

print(df0)

dat1 = [
    ['2019-07-02','9997','749'],
    ['2019-07-03','9997','757'],
    ['2019-07-04','9997','769'],
    ['2019-07-05','9997','762'],
    ['2019-07-08','9997','760'],
    ['2019-07-09','12','765'],
    ['2019-07-10','34','769']
]
df1 = pd.DataFrame(dat1,columns=["A","B","C"])
print(df1)

df2=pd.merge(df0, df1, how="outer")


df2.set_index("A",inplace=True) 

print(df2)

result
### df0 #####
            A     B    C
0  2019-07-01  9997  740
1  2019-07-02  9997  749
2  2019-07-03  9997  757
3  2019-07-04  9997  769
4  2019-07-05  9997  762
5  2019-07-08  9997  760

#### df1 ############ 
            A     B    C
0  2019-07-02  9997  749
1  2019-07-03  9997  757
2  2019-07-04  9997  769
3  2019-07-05  9997  762
4  2019-07-08  9997  760
5  2019-07-09    12  765
6  2019-07-10    34  769

#### df2 ############ 
               B    C
A                    
2019-07-01  9997  740
2019-07-02  9997  749
2019-07-03  9997  757
2019-07-04  9997  769
2019-07-05  9997  762
2019-07-08  9997  760
2019-07-09    12  765
2019-07-10    34  769

##5-23 numpy.ndarray型の特定の要素の個数をカウントする

/home/sampletest/sample.py
import numpy as np
a = np.arange(12).reshape((3, 4))
type(a)
print(a)
result
print(a)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

type(a)
<class 'numpy.ndarray'>

print(np.count_nonzero(a < 4))
4

##5-24 iterrows() : インデックス名(行名)とその行のデータを取り出す
1行ずつ、インデックス名(行名)とその行のデータ(pandas.Series型)のタプル(index, Series)を取得できる。

/home/sampletest/sample.py
import numpy as np
import pandas as pd


dat = [
    ['2019-07-01',10,-2],
    ['2019-07-02',2,-5],
    ['2019-07-03',6,-10],
    ['2019-07-04',8,-8],
    ['2019-07-05',15,-6],
    ['2019-07-08',7,-8]
]
df = pd.DataFrame(dat,columns=["A","B","C"])
df.set_index("A",inplace=True) 

print(df)


print('\n','how to ues iteerrows','\n')

for index, item in df.iterrows():
    print('index:',index)
    print('item:','\n',item)
result
             B   C
A                 
2019-07-01  10  -2
2019-07-02   2  -5
2019-07-03   6 -10
2019-07-04   8  -8
2019-07-05  15  -6
2019-07-08   7  -8

 how to ues iteerrows 

index: 2019-07-01
item: 
 B    10
C    -2
Name: 2019-07-01, dtype: int64
index: 2019-07-02
item: 
 B    2
C   -5
Name: 2019-07-02, dtype: int64
index: 2019-07-03
item: 
 B     6
C   -10
Name: 2019-07-03, dtype: int64
index: 2019-07-04
item: 
 B    8
C   -8
Name: 2019-07-04, dtype: int64
index: 2019-07-05
item: 
 B    15
C    -6
Name: 2019-07-05, dtype: int64
index: 2019-07-08
item: 
 B    7
C   -8
Name: 2019-07-08, dtype: int64


1
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?