プログラム初心者がpythonを勉強する方法!その9・エクセルからデータを自由に抽出してみる!pandas!

スポンサーリンク
036-ホビー

ヘタレシステム管理者の管理人です。

pythonでの勉強9日目です。

今のところの目標は・・・

pythonでシフト表を自動で組んでみることですが・・・

その手前で躓きまくりです。

とりあえず・・・

今頑張っているのは・・・・

エクセルから欲しいデータを取得する方法です。

エクセルはこちらに保存してあります

エクセルから欲しいデータを自由に取得する

抽出したいデータは・・・

よくあるシフト表から

  • 勤務日
  • 従業員名
  • 従業員別の休暇取得数
  • 各日付の出勤日数

です。

エクセルを読み込んでこれらのデータを配列で取得することが結構ムズイ・・・

ここまででかなりの日数を要しました。

コード

スポンサーリンク

コードは次のとおりです。

#ライブラリをインポート

import pandas
import openpyxl

#ファイルを指定
df = pandas.read_excel('python_shift2.xlsx') 

#勤務表を取得
df = df.iloc[6:, 0:]
df = df.reset_index(drop=True)
df.columns = [i for i in range(len(df.columns)) ]

#空白値を0
df=df.fillna(0)

#希望休を2に置換
df=df.replace('◎',1)

#表を表示させて確認
print(df)

#変数設定
#勤務日を取得して確認
workdays = list(range(1,32))
print(workdays)

#従業員リストを取得して内容を確認
worker = df.iloc[0:10,0:1]
worker = worker.transpose() #行列を入れ替え
worker = worker.iloc[0,0:].values
print(worker)

#休日数を取得
holiday = df.iloc[2:12,32:33]
holiday = holiday.transpose() #行列を入れ替え
holiday = holiday.iloc[0,0:].values
print(holiday)

#最低出勤人数を取得
syukkin = df.iloc[11,1:32].values
print(syukkin)

#従業員の希望休を取得
#データ範囲を指定
df2 = df.iloc[0:10,0:32]
print(df2)

# 一致するインデックスと列を格納する空のリストを初期化する
hopeday = []

# テーブルの行を反復処理する
for row_index, row in df2.iterrows():
    for cols in df2.columns:
        if df2.loc[row_index,cols] == 1:
            row_values = df2.loc[row_index, 0]
#            col_values = df2.loc[2,cols]
            hopeday.append((row_values, cols))

# 結果を出力する
print(hopeday)

ブログランキングにご協力ください!
ブログランキング・にほんブログ村へ

出力される結果は次のとおりです。

各コードの説明は次のとおりです・・・

管理人が難しいと感じた部分のみ抽出して説明します。

スポンサーリンク

勤務表を取得

#勤務表を取得
df = df.iloc[6:, 0:]

#インデックスをリセット
df = df.reset_index(drop=True)

#カラム名から"unnamed"を消して数字で付ける
df.columns = [i for i in range(len(df.columns)) ] 

従業員名を取得

#従業員リストを取得して内容を確認
worker = df.iloc[0:10,0:1]

#行列を入れ替え
worker = worker.transpose()

#データを取得
worker = worker.iloc[0,0:].values
print(worker)

従業員の希望休を取得

#従業員の希望休を取得
#データ範囲を指定
df2 = df.iloc[0:10,0:32]
print(df2)

# 一致するインデックスと列を格納する空のリストを初期化する
hopeday = []

# テーブルの行を反復処理する
#行を順番に処理してインデックス名を取得
for row_index, row in df2.iterrows():

    #列を順番に処理してカラム名を取得
    for cols in df2.columns:

        #セルが 1 かどうかを判断
        if df2.loc[row_index,cols] == 1:

            #該当するセルの従業員名を取得
            row_values = df2.loc[row_index, 0]

      #従業員名と希望休の日付を配列に格納
            hopeday.append((row_values, cols))

たったこれだけの事をやるのに・・・

2~3日もかかりヘトヘトです。

管理人にはプログラミングの才能は無いようです。

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました