Pandas ,pythonコードメモ 7

# 1 この記事は

Pandas ,pythonの各種操作方法をメモする。

| 題名 | リンク | 
|:-----------|------------:|
| 【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 DateFrameの数値に着色する。


```python:sample.py
#出力したデータフレームの値に対して着色する。各列にそれぞれの着色ルールを適用する。

import pandas as pd
import numpy as np

dat = [
    ['2019-07-01',740,3],
    ['2019-07-02',720,5],
    ['2019-07-03',650,2],
    ['2019-07-04',600,1],
    ['2019-07-05',550,-4],
    ['2019-07-08',500,4]
]
df = pd.DataFrame(dat,columns=["Date","A","B"])

#ルールcolor0の定義
def color0(val):
    color = 'lightgreen' if val >500 and val>600 else '' #1より大なら薄緑、その他は白
    return 'background-color: %s' % color

#ルールcolor1の定義
def color1(val):
    color = 'lightgreen' if val<0 else '' #1より大なら薄緑、その他は白
    return 'background-color: %s' % color

#A列には着色ルールcolor0、B列には着色ルールcolor1を適用する。
df.style.applymap(color0,subset=['A']).applymap(color1,subset=['B'])


```
実行結果
![344.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/29decad8-c69c-37bf-49fc-8d9d13d30c95.jpeg)



### 2-2 各グループ内で条件に合致したデータが何個あるか算出する


```python:sample.py
#各グループ内で条件に合致したデータが何個あるか算出する。

import pandas as pd

df = pd.DataFrame(
    {'id': list('aaabbcccc'),
     'val': [1,2,3,1,2,1,2,4,5]})
print("dfを出力する")
display(df)
out1 = df.groupby('id').apply(lambda d: d[d.val >= 3]['val'].count())
print("各グループにおいて条件に合致するデータがいくらあるか出力する。")
print(out1)
```

出力結果

![345.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/11173283-060a-b9b4-4ba3-4aee72fd46bc.jpeg)

### 2-2 2次元データを対象に、該当データがDataFrameの何行目にあるかを探索する。

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

print("列A,列Bを2次元を対象に、対象データがDataFrameの何行目にあるかを探索する。")



#dataを定義する。
dat = [
    [100,111,'9997','740'],
    [100,123,'9997','749'],
    [100,200,'9997','757'],
    [200,201,'9997','769'],
    [200,202,'9997','762'],
    [300,301,'9997','760']
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
lst0=df["A"].to_list()
lst1=df["B"].to_list()
mi = pd.MultiIndex.from_arrays([lst0, lst1])
mi.get_loc((100, 200))  #A列100, B列200がDataFrameの何行目にあるかを返す。 出力→2
```

### 2-3 単独列を対象に、対象データがDataFrameの何行目にあるかを探索する。

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

print("単独列を対象に、対象データがDataFrameの何行目にあるかを探索する。")


#dataを定義する。
dat = [
    [100,111,'9997','740'],
    [100,123,'9997','749'],
    [100,200,'9997','757'],
    [200,201,'9997','769'],
    [200,202,'9997','762'],
    [300,301,'9997','760']
]

#datをDataFrame型変数dfに格納する。
df = pd.DataFrame(dat,columns=["A","B","C","D"])
df=df.set_index(["A"])
print("#列Aの300は何行目にあるか?")
print(df.index.get_loc(300)) 
```
(出力)
単独列を対象に、対象データがDataFrameの何行目にあるかを探索する。
#列Aの300は何行目にあるか?
5

### 2-4 2つのDataFrameを結合させる。

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

print("2つのDataFrameを結合させる。")

#dataを定義する。
dat0 = [
    [1,120],
    [3,140],
    [4,201],
    [5,202],
    [6,301]
]

dat1 = [
    [1,12],
    [4,21],
    [6,31],
    [8,70]
]

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

print("display df0")
display(df0)
print("display df1")
display(df1)

print("df0とdf1を結合させる。key列はA。列Aを基準にdf0とdf1に共通のものを残す")
df=pd.merge(df0, df1, on="A",how='inner')
display(df)

print("df0とdf1を結合させる。key列はA。列Aを基準にdf0とdf1の双方に含まれるものを出力する")
df=pd.merge(df0, df1, on="A",how='outer')
display(df)

print("df0とdf1を結合させる。key列はA。列Aを基準にdf0のみ含まれるものを出力する")
df=pd.merge(df0, df1, on="A",how='left')
display(df)

print("df0とdf1を結合させる。key列はA。列Aを基準にdf1のみ含まれるものを出力する")
df=pd.merge(df0, df1, on="A",how='right')
display(df)

```
(出力)
2つのDataFrameを結合させる。
display df0
A	B
0	1	120
1	3	140
2	4	201
3	5	202
4	6	301
display df1
A	C
0	1	12
1	4	21
2	6	31
3	8	70
df0とdf1を結合させる。key列はA。列Aを基準にdf0とdf1に共通のものを残す
A	B	C
0	1	120	12
1	4	201	21
2	6	301	31
df0とdf1を結合させる。key列はA。列Aを基準にdf0とdf1の双方に含まれるものを出力する
A	B	C
0	1	120.0	12.0
1	3	140.0	NaN
2	4	201.0	21.0
3	5	202.0	NaN
4	6	301.0	31.0
5	8	NaN	70.0
df0とdf1を結合させる。key列はA。列Aを基準にdf0のみ含まれるものを出力する
A	B	C
0	1	120	12.0
1	3	140	NaN
2	4	201	21.0
3	5	202	NaN
4	6	301	31.0
df0とdf1を結合させる。key列はA。列Aを基準にdf1のみ含まれるものを出力する
A	B	C
0	1	120.0	12
1	4	201.0	21
2	6	301.0	31
3	8	NaN	70



### 2-5 列単位にて重複している要素を抽出する

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

print("列単位にて重複している要素を抽出する")


def dupli_get(df,COL):

    list1=df[COL].values.tolist()
    dup = [x for x in set(list1) if list1.count(x) > 1]
    return dup 


#dataを定義する。
dat0 = [
    [1,120],
    [3,140],
    [3,201],
    [5,202],
    [5,301]
]


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

display(df0)

print("A列にて重複している要素を抽出する")
dupli_get(df0,"A")

```
(出力)

列単位にて重複している要素を抽出する
A	B
0	1	120
1	3	140
2	3	201
3	5	202
4	5	301
A列にて重複している要素を抽出する
[3, 5]



### 2-6 DataFrame内の文字を置換する

```python:sample.py
df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
                   'B': [5, 6, 7, 8, 0],
                   'C': ['a', 'b', 'c', 'd', 'e']})
print("置換前 DataFrameの0を5に置換する。")
display(df)

#DataFrameの0を5に置換する。
df=df.replace(0, 5)

print("置換後")
display(df)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/2fbf2b37-930f-5c14-0b35-2da5e94b0c90.png)



### 2-7 既存のindexとは別に、通し番号のIDを各行に付与する

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

dat = [
    ['2019-07-01',740,3],
    ['2019-07-02',720,5],
    ['2019-07-03',650,2],
    ['2019-07-04',600,1],
    ['2019-07-05',550,-4],
    ['2019-07-08',500,4]
]

df = pd.DataFrame(dat,columns=["Date","A","B"])
df['ID'] = pd.RangeIndex(start=1, stop=len(df.index) + 1, step=1)
print("既存のindexとは別に、通し番号のIDを各行に付与する")
display(df)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/d3551e3d-7485-bbf5-c15a-32565db533f8.png)


### 2-8 scipyで極大値、極小値を探索する


https://qiita.com/wrblue_mica34/items/e174a71570abb710dcfb

### 2-9 所定の期間の営業日数を数える

```python:sample.py
def eigyobi_get(start_date,end_date):

    # 日数を計算
    delta = end_date - start_date

    # 営業日数
    business_days = 0

    for i in range(delta.days + 1):
        day = start_date + datetime.timedelta(days=i)
        # 曜日を取得(月曜日は0,日曜日は6)
        if calendar.weekday(day.year, day.month, day.day) < 5 and jpholiday.is_holiday(day)==False: 
            business_days += 1

    return business_days-1

start_date = datetime.datetime.strptime("2023/1/15","%Y/%m/%d")

# 本日
end_date = datetime.datetime.today()
eigyobi_get(start_date,end_date)

```