Pandas使い方メモ

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

| 題名 | リンク | 
|:-----------|------------:|
| 【python】Pandasの使い方 |     [LINK](https://qiita.com/NT1123/items/ab1c6dc582684d7d7436) | 
| 【python】Pandas2の使い方 |     [LINK](https://qiita.com/NT1123/items/24e6b848761f83514720) | 
| 【python】Pandas3の使い方 |     [LINK](https://qiita.com/NT1123/items/4bd0fa8cc8254b3b651d) | 
| 【python】Pandas4の使い方 |     [LINK](https://qiita.com/NT1123/items/6e6bcc880aae6f0940ed) | 
| 【python】Pandas5の使い方 |     [LINK](https://qiita.com/NT1123/items/376d3d6eec559a3cd78e) | 
| 【python】Pandas ,pythonコードメモ 6 |     [LINK](https://qiita.com/NT1123/items/d2357e803057699a9a9c) | 


#2 CVSデータを扱う

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

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

```console:/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ファイルの列名も一緒に読み出す)

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

```console
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を日付型に変換する)

```python:/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)
```
実行結果

```console
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データ読み取り、列名を設定する。

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

```console:/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
```


```python:/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)
```

実行結果

```console
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列を指定する。

サンプルデータ

```console:/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
```

```python:/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)
```

実行結果

```console
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ファイルに書き出す。

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




#3 行列を作成する。

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

```python:/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)
```
実行結果

```console
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 空の列を追加し、追加した列にデータを配置する

```python:/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)
```
実行結果

```console
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)

```python:/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)

```
実行結果

```console
       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)

```python:/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)
```
実行結果

```console
            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列の乱数(正規分布)を作成する。

```python:/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)
```
実行結果

```console
            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番目のデータの変化率を算出する。(欠損データ処理も行う)

```python:/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)
```
実行結果

```console
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 各列の平均と分散を計算する

```python:/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)
```

実行結果

```console
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 各列のデータを正規化する。

正規化とは詳しくは[こちら](https://note.nkmk.me/python-list-ndarray-dataframe-normalize-standardize/)
今回の実施例は、scipy.stats.zscore()関数を使用している。平均0、分散1に正規化（標準化）する



```python:/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

```
実行結果

```console
データ正規化処理前
       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 各列のデータの重相関をとる。

```python:/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'])

```
実行結果

```console
             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を指定し、対象配列から特定業を抽出する


```python:/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'])
```

実行結果

```console
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行目を抽出することを行っている

```python:/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]])

```

実行結果

```console
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つの行列を横方向に結合する。

```python:/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)
```

実行結果

```console
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つの行列を縦方向に結合する。

```python:/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])
```

実行結果

```console
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段下にシフトする。

```python:/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)
```

実行結果

```console
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 列名を付与する

```python:/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)
```

実行結果

```console

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 列または行データを削除する

```python:/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)
```
実行結果

```console
       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 条件に合うデータを抽出する。

```python:/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)

```

実行結果

```console
(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のデータを昇順に並べる。

```python:/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)
```

実行結果

```consol
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のデータを行番号を指定して取り出す。

```python:/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]) 
```

実行結果

```consol

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)に従い行データを生成する。

```python:/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)
```

実行結果

```consol

            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 複数列データを比較し、比較結果により行データを生成する。

```python:/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)

```

実行結果

```console

    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)

https://qiita.com/sawadyrr5/items/2ec516435d69064102c5

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

https://note.nkmk.me/python-collections-ordereddict/



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

```python:/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)


```

実行結果

```console
変更前
               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の列を入れ替える


```python:/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)
```

実行結果

```console
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の任意の列を取り出す。

```python:/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)
```

実行結果

```console
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にする。


```python:/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
```

実行結果

```console

****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型のプロパティーと要素を取得する


```python:/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は上書きする。

```python:/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)

```

```console: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型の特定の要素の個数をカウントする



```python:/home/sampletest/sample.py
import numpy as np
a = np.arange(12).reshape((3, 4))
type(a)
print(a)
```

```console: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)を取得できる。

```python:/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)
```

```console: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


```