Python テクニック集


Dataframeの生成

# import
import pandas as pd 
# ファイルからDataFrameを生成
df_weekly = pd.read_csv('./weekly.csv')
df_weekly

》response

  data name case time cnt day
0 20231002 hori flow 2.0 2.0 1
1 20231002 hori mile 1.0 1.0 1
2 20231002 hori orga 4.0 NaN 1

# 辞書型からDataFrameを生成
df = pd.DataFrame({'a':['abcde','fghij','klmno'],
                   'b':[123, 456, 789]})
df

》Result

  a b
0 abcde 123
1 fghij 456
2 klmno 789

# SeriesからDataFrameを生成 ※df.bで取得できるオブジェクトの型はSeries型。"data = "は省略可
df2 = pd.DataFrame(data = {
    "id": df.index,
    "pred":df.b})
df2

》Result

  id pred
0 0 123
1 1 456
2 2 789

 


Dataframeの確認

# DataFrameの件数
print(len(df_weekly))
print()
print(df_weekly.count())

》response

3

 

data 3

name 3

case 3

time 3

cnt 2

day 3

dtype: int64

 

# DataFrameの平均・最小値・最大値等を確認
df_weekly.describe()

》Result

  data time cnt day
count 3.0 3.000000 2.000000 3.0
mean 20231002.0 2.333333 1.500000 1.0
std 0.0 1.527525 0.707107 0.0
min 20231002.0 1.000000 1.000000 1.0
25% 20231002.0 1.500000 1.250000 1.0
50% 20231002.0 2.000000 1.500000 1.0
75% 20231002.0 3.000000 1.750000 1.0
max 20231002.0 4.000000 2.000000 1.0

# 各カラムの型の確認
df_weekly.dtypes

》Result

data int64

name object

case object

time float64

cnt float64

day int64

dtype: object

 


Dataframeの欠損日

# 欠損値の件数
df_weekly.isnull().sum()

》Result

data 0

name 0

case 0

time 0

cnt 1

day 0

dtype: int64

 

# 欠損値のあるデータを抽出
flg = df_weekly["cnt"].isnull()
df_weekly.loc[(flg)]

》Result

  data name case time cnt day
2 20231002 hori orga 4.0 NaN 1

# 欠損値を任意の値に置換
df_weekly["cnt"] = df_weekly["cnt"].fillna(0)
df_weekly.loc[(flg)]

》Result

  data name case time cnt day
2 20231002 hori orga 4.0 0.0 1

 


Dataframeの取得

# 先頭行から指定カラムを取得
df_weekly.loc[:,["name","case","cnt"]]

》Result

  name case cnt
0 hori flow 2.0
1 hori mile 1.0
2 hori orga 0.0

 

# 完全一致するものを抽出
df_weekly[df_weekly.case == "flow"]

》Result

  data name case time cnt day
0 20231002 hori flow 2.0 2.0 1

 


Dataframeの集計

# groupby:まとめたい列 sum:集計方法 reset_index:インデックスを初期化 rename:カラム名を変更 sort_values:ソート
df_weekly.groupby("name").sum()["cnt"].reset_index().rename(columns={"cnt":"cnt_sum"}).sort_values("name")

》Result

  name cnt_sum
0 hori 3.0

 

# グループ毎のデータ件数
df_weekly.loc[:, ['name','case','day']].groupby(['name','case']).count()

》Result

    day
name case  
hori flow 1
mile 1
orga 1

 

# ピポットテーブル 行(index)と列(columns) valuesで集計したい数値列 aggfuncに集計方法
pd.pivot_table(df_weekly, index="name", columns="case", values=['day'], aggfunc='count')

》Result

  day
case flow mile orga
name      
hori 1 1 1

 


グラフ

import matplotlib.pyplot as plt
%matplotlib inline
# Matplotlibで日本語を表示する設定
from matplotlib import rcParams
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['Hiragino Maru Gothic Pro', 'Yu Gothic', 'Meirio', 'Takao', 
                               'IPAexGothic', 'IPAPGothic', 'VL PGothic', 'Noto Sans CJK JP']
# case毎の件数を集計
df_cnt = df_weekly[(df_weekly.case == "flow") | (df_weekly.case == "mile")].loc[:, ['case','cnt']].groupby("case").sum()["cnt"].reset_index().rename(columns={"cnt":"cnt"})

# 0件のデータを生成してdf_cntにマージ
df_appd = pd.DataFrame({'case':'orga', 'cnt':0.0}, index=[2])
df_cnt = pd.concat([df_cnt, df_appd], ignore_index=True)

# case毎の工数を集計
df_time = df_weekly.loc[:, ['case','time']].groupby("case").sum()["time"].reset_index().rename(columns={"time":"time"})

# 件数と工数の集計を結合
df_join = pd.merge(df_cnt, df_time, on="case", how="inner")

df_join.plot.bar(x='case', grid=True, figsize=(6,5), title="案件毎の件数・工数")

》Result

<Axes: title={'center': '案件毎の件数・工数'}, xlabel='case'>


lambda

# apply()との組み合わせ applyメソッドが呼び出されるときデータフレームの各列をxに渡し、その列の各要素に x * 2 を適用
df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6],
    'C': [7, 8, 9]})
df_res = df.apply(lambda x: x * 2, axis=0)
df_res

》Result

  A B C
0 2 8 14
1 4 10 16
2 6 12 18

 

# リストの要素にlambdaを適用
nums = [1, 2, 3]
res = map(lambda x: x**2, nums)
print(list(res))

》Result

[1, 4, 9]

 

# DataFrameの要素にlambdaを適用
df_weekly["over"] = df_weekly['time'].map(lambda x: x -2 if x > 2 else 0)
df_weekly

》Result

  data name case time cnt day over
0 20231002 hori flow 2.0 2.0 1 0.0
1 20231002 hori mile 1.0 1.0 1 0.0
2 20231002 hori orga 4.0 0.0 1 2.0

 


hoge

ああ

》response