Pandasの使い方2

#1 この記事は

DataFrame型データの各種操作方法をメモする。

| 題名 | リンク | 
|:-----------|------------:|
| 【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 内容

### 2-1 Multi Index型 DataFrameのデータについて特定のindexのみのデータを表示する。

```python:sample.py
import pandas as pd
import numpy as np
idx = pd.IndexSlice

#dataを定義する。
dat = [
    [100,'2019-07-01','9997','740'],
    [100,'2019-07-02','9997','749'],
    [100,'2019-07-03','9997','757'],
    [200,'2019-07-01','9997','769'],
    [200,'2019-07-02','9997','762'],
    [200,'2019-07-03','9997','760']
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print("dfを表示する","\n",df)

#index=100のデータを抽出する。
df=df.loc[idx[100, :], :]

print("dfからindex=100のデータを抽出する。","\n",df)


#index=100,D列のデータを抽出する。
df=df.loc[idx[100, :], ["D"]]

print("dfからindex=100,D列のデータを抽出する。","\n",df)


```
実行結果

```console
dfを表示する 
                    C    D
A   B                    
100 2019-07-01  9997  740
    2019-07-02  9997  749
    2019-07-03  9997  757
200 2019-07-01  9997  769
    2019-07-02  9997  762
    2019-07-03  9997  760
dfからindex=100のデータを抽出する。 
                    C    D
A   B                    
100 2019-07-01  9997  740
    2019-07-02  9997  749
    2019-07-03  9997  757


dfからindex=100,D列のデータを抽出する。 
                   D
A   B              
100 2019-07-01  740
    2019-07-02  749
    2019-07-03  757
```

### 2-2 DataFrame型の行数、列数を求める。

```python:sample.py
#dataを定義する。
dat = [
    [100,'2019-07-01',1,1],
    [100,'2019-07-02',0,0],
    [200,'2019-07-03',0,1],
    [200,'2019-07-01',1,1],
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print("dfを表示する","\n",df)

print("DataFrameの行数を計算する",len(df))
print("DataFrameの列数を計算する",len(df.columns))
```
実行結果

```console
dfを表示する 
                 C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0  0
200 2019-07-03  0  1
    2019-07-01  1  1

DataFrameの行数を計算する 4
DataFrameの列数を計算する 2
```

### 2-3 DataFrame型の各行ごとの1の個数を数える

```python:sample.py
#dataを定義する。
dat = [
    [100,'2019-07-01',1,1],
    [100,'2019-07-02',0,0],
    [200,'2019-07-03',0,1],
    [200,'2019-07-01',1,1],
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print(df)

df1=df.loc[idx[100, :], :]
print("dfからindex=100のデータを抽出する。","\n",df1)


print("各行ごとに1の個数を数える")

for i in range(0,len(df1)):
    print(str(i)+"行目の1の個数",df1.iloc[i].values.tolist().count(1))
```
実行結果

```console
                C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0  0
200 2019-07-03  0  1
    2019-07-01  1  1

dfからindex=100のデータを抽出する。 
                 C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0  0

各行ごとに1の個数を数える
0行目の1の個数 2
1行目の1の個数 0
```

### 2-4 DataFrame型の特定列の要素の種類ごとに個数を数える。

```python:sample.py
import pandas as pd
import numpy as np
idx = pd.IndexSlice


#dataを定義する。
dat = [
    [100,'2019-07-01',1,1],
    [100,'2019-07-02',0,0],
    [100,'2019-07-03',1,0],    
    [100,'2019-07-04',1,0],        
    [200,'2019-07-03',0,1],
    [200,'2019-07-01',1,1],
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print(df)

df1=df.loc[idx[100, :], :]
print("dfからindex=100のデータを抽出する。","\n",df1)


print(df1['C'].value_counts())

```
実行結果

```console
                 C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0  0
    2019-07-03  1  0
    2019-07-04  1  0
200 2019-07-03  0  1
    2019-07-01  1  1
dfからindex=100のデータを抽出する。 
                 C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0  0
    2019-07-03  1  0
    2019-07-04  1  0
print("C列の要素の種類ごとに個数を数える。")

C列の要素の種類ごとに個数を数える。
1    3
0    1
Name: C, dtype: int64

```



### 2-6 DataFrame型の特定列の数値の正数、負数の個数を求める

```python:sample.py
#dataを定義する。
dat = [
    [100,'2019-07-01',1,1],
    [100,'2019-07-02',0,-6],
    [100,'2019-07-03',1,-2],    
    [100,'2019-07-04',1,-3],        
    [200,'2019-07-03',0,-9],
    [200,'2019-07-01',1,1],
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print(df)

df1=df.loc[idx[100, :], :]


df2p = df1[(df1['D']>0)]
df2n = df1[(df1['D']<0)]
df2z = df1[(df1['D']==0)]

print("df1の正数、負数の個数を数える")
print("pos count",len(df2p))
print("neg count",len(df2n))
print("zero count",len(df2z))

```
実行結果

```console
                C  D
A   B               
100 2019-07-01  1  1
    2019-07-02  0 -6
    2019-07-03  1 -2
    2019-07-04  1 -3
200 2019-07-03  0 -9
    2019-07-01  1  1
pos count 1
neg count 3
zero count 0
```




### 2-5 DataFrame型の各行ごとに自作関数を適用する。

```python:sample.py
import pandas as pd
import numpy as np


#dataを定義する。
dat = [
    [100,'2019-07-01',1,4,9],
    [100,'2019-07-02',0,0,7],
    [100,'2019-07-01',0,-1,-3],
    [100,'2019-07-02',-1,1,6],    
    [200,'2019-07-03',0,1,2],
    [200,'2019-07-01',1,-1,6],
]


#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D","E"])


df=df.set_index(["A","B"])

print("df",df)


def func(x):
    return x-x.min()

df1=df.apply(func, axis='columns')


print("適用後",df1)
```
実行結果

```console
df                 C  D  E
A   B                  
100 2019-07-01  1  4  9
    2019-07-02  0  0  7
    2019-07-01  0 -1 -3
    2019-07-02 -1  1  6
200 2019-07-03  0  1  2
    2019-07-01  1 -1  6
適用後                 C  D  E
A   B                  
100 2019-07-01  0  3  8
    2019-07-02  0  0  7
    2019-07-01  3  2  0
    2019-07-02  0  2  7
200 2019-07-03  0  1  2
    2019-07-01  2  0  7
```


### 2-6 DataFrame型の各indexごとにデータを正規化する。

```python:sample.py
import pandas as pd
import numpy as np
import scipy.stats
idx = pd.IndexSlice

#dataを定義する。
dat = [
    [100,'2019-07-01',2,7],
    [100,'2019-07-02',4,77],
    [100,'2019-07-01',8,8],
    [100,'2019-07-02',16,89],    
    [200,'2019-07-03',100,9],
    [200,'2019-07-01',200,99],
    [200,'2019-07-01',400,123],
    [200,'2019-07-01',200,345],    
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])

#A,B列をindexに指定する。
df=df.set_index(["A","B"])

print("df",df)

def transformation_func(s):
    return scipy.stats.zscore(s)

#indexごとに、データを正規化する。
print("indexごとに、データを正規化する。")

class_groupby = df.groupby("A") 
df1=class_groupby["C"].transform(transformation_func)
df1
```
実行結果

```console
df                   C    D
A   B                   
100 2019-07-01    2    7
    2019-07-02    4   77
    2019-07-01    8    8
    2019-07-02   16   89
200 2019-07-03  100    9
    2019-07-01  200   99
    2019-07-01  400  123
    2019-07-01  200  345
indexごとに、データを正規化する。
A    B         
100  2019-07-01   -1.025755
     2019-07-02   -0.652753
     2019-07-01    0.093250
     2019-07-02    1.585258
200  2019-07-03   -1.147079
     2019-07-01   -0.229416
     2019-07-01    1.605910
     2019-07-01   -0.229416
Name: C, dtype: float64
```

### 2-7 母集団の統計データを自動計算する。(上位xx%に該当するサンプル値を表示する)

```python:sample.py
import pandas as pd
import numpy as np

dset=np.random.normal(0,3,1000) #データを1000個発生させる
df=pd.DataFrame(dset,columns=['X']) #Dataframe型にする。

dfsta=df.describe(percentiles=[0.2, 0.4, 0.6, 0.8])
print(dfsta)
dfsta60=dfsta.loc['60%', :]
print('dfsta60',dfsta60[0]) 

```
実行結果

```console
                X
count  1000.000000
mean     -0.056981
std       3.056150
min      -9.532908
20%      -2.625477
40%      -0.827265
50%      -0.013945
60%       0.665222
80%       2.356556
max       9.736101
X    0.749529
Name: 60%, dtype: float64
```

### 2-8 複数のDataframeをDict型で結合する

```python: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=[2])

df3=2*df1

dict1={"X":df1,"Y":df2}
dict2={"Z":df3}
dict2.update(dict1)

print(dict2)

```
実行結果

```console
{'Z':     D   E
1  20  26
2  22  28
4  24  30, 'X':     D   E
1  10  13
2  11  14
4  12  15, 'Y':    D  E
2  0  0}
```

### 2-9 重複を除いた数値の個数を数える。列に含まれる要素を重複排除し列挙する

```python:sample.py
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'D': [1, 1, 2],
                   'E': [13, 14, 15]},
                  index=[1, 2, 4])

print(df1)

u = df1 ['D'].unique()

print("D列の数字の個数。ただし重複は除く")
print(len(u))

```
実行結果

```console
   D   E
1  1  13
2  1  14
4  2  15

D列の数字の個数。ただし重複は除く
2
```

###2-10 DateFrameを2つのkeyで昇順にソートする方法

https://qiita.com/NT1123/items/8c3052926cc18faa0309