LoginSignup
0

More than 1 year has passed since last update.

Pandas ,pythonコードメモ 7

Last updated at Posted at 2022-05-07

1 この記事は

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

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

2 内容

2-1 DateFrameの数値に着色する。

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

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

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

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

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の何行目にあるかを探索する。

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を結合させる。

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 列単位にて重複している要素を抽出する

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内の文字を置換する

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

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

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

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

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

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)

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
0