質問編集履歴
3
追記
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -57,4 +57,69 @@ | |
| 57 57 | 
             
            ### 補足情報
         | 
| 58 58 | 
             
            pythonを始めて間もなく読みずらいコードですが、どなたかご教授よろしくお願いします。
         | 
| 59 59 | 
             
            google colaboratory  python 3.7.12
         | 
| 60 | 
            -
                                 pandas 1.1.5
         | 
| 60 | 
            +
                                 pandas 1.1.5
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            ### 追記
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            [このexcelファイルがkiso_です](https://www.dropbox.com/s/qj19d12zhjk0xgd/Book1.xlsx?dl=0)
         | 
| 65 | 
            +
            このファイルをread_excel関数で読み取り、そのデータをgeneに送っています。
         | 
| 66 | 
            +
            ```
         | 
| 67 | 
            +
            import pandas as pd
         | 
| 68 | 
            +
            import random
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            def read_excel():
         | 
| 71 | 
            +
                df = pd.read_excel('Book1.xlsx')
         | 
| 72 | 
            +
                ho = df.iloc[2:42, 32:34]
         | 
| 73 | 
            +
                day = df.iloc[1:2, 1:32]
         | 
| 74 | 
            +
                day = day.replace('土', 0)
         | 
| 75 | 
            +
                day = day.replace('日', 0)
         | 
| 76 | 
            +
                day.columns = [i + 1 for i in range(len(day.columns))]
         | 
| 77 | 
            +
                df = df.iloc[2:42, 1:32]
         | 
| 78 | 
            +
                df = df.fillna(0)
         | 
| 79 | 
            +
                df = df.replace('o', 4)
         | 
| 80 | 
            +
                df.columns = [i + 1 for i in range(len(df.columns))]
         | 
| 81 | 
            +
                df.index = [i + 1 for i in range(len(df.index))]
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                holiday = ho.iloc[:,0:1].dropna().reset_index(drop=True)
         | 
| 84 | 
            +
                holiday.columns = ['休日数']
         | 
| 85 | 
            +
                ad = ho.iloc[:,1:2].fillna(0).reset_index(drop=True)
         | 
| 86 | 
            +
                ad.columns = ['管理者']
         | 
| 87 | 
            +
                kiso = df.iloc[:,0:31].reset_index(drop=True)
         | 
| 88 | 
            +
                kiso.columns = [i + 1 for i in range(len(kiso.columns))]
         | 
| 89 | 
            +
                return kiso,holiday,df,ad,day,len(kiso.columns)
         | 
| 90 | 
            +
             | 
| 91 | 
            +
            def gene(kiso, holiday, day, days):
         | 
| 92 | 
            +
                count = 0                 
         | 
| 93 | 
            +
                for i in range(len(kiso.index)):         #今回では40回分(午前午後含む)を処理
         | 
| 94 | 
            +
                    if i % 2 == 0: 
         | 
| 95 | 
            +
                        holi = holiday.loc[i / 2][0]     #2回に1回1人分の休日数を取得
         | 
| 96 | 
            +
                   
         | 
| 97 | 
            +
                    count += 1
         | 
| 98 | 
            +
                    for l in range(1, days + 1):         #1人分の午前、午後のどちらかを埋める(午前から)
         | 
| 99 | 
            +
                        d = day.loc[1][l]                #土日か平日を取得
         | 
| 100 | 
            +
                        g = kiso.loc[i][l]               
         | 
| 101 | 
            +
                        if g != 4:                       
         | 
| 102 | 
            +
                            if g != 1 and g != 2 and g != 3: 
         | 
| 103 | 
            +
                                if d == 0:                    #希望休がなく社員の希望もなしで、休日なら
         | 
| 104 | 
            +
                                    kiso.loc[i][l] = 0       #休みする
         | 
| 105 | 
            +
                                    holi -= 1                #2回に1回取得するholiから1を引く
         | 
| 106 | 
            +
                                else:
         | 
| 107 | 
            +
                                    kiso.loc[i][l] = random.randint(1, 3)    #希望がなく、休日でなければ
         | 
| 108 | 
            +
                        else:
         | 
| 109 | 
            +
                            holi -= 1                        #希望休の分の休みを引く
         | 
| 110 | 
            +
                    
         | 
| 111 | 
            +
                    if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
         | 
| 112 | 
            +
                        
         | 
| 113 | 
            +
                        for k in range(holi):         #残っている休みの数だけループ
         | 
| 114 | 
            +
                            while True:                      #必ず休みを消化するためwhile
         | 
| 115 | 
            +
                                o = random.randint(0, 1)      #午前と午後のどちらかを選ぶ
         | 
| 116 | 
            +
                                r = random.randint(1, days)   #1日から31日の中で選ぶ
         | 
| 117 | 
            +
                                if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
         | 
| 118 | 
            +
                                    kiso.loc[i - o][r] = 0   #o,rのところを休みに
         | 
| 119 | 
            +
                                    break
         | 
| 120 | 
            +
                            
         | 
| 121 | 
            +
                return kiso
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            kiso_,holiday,df,ad,day,days = read_excel()
         | 
| 124 | 
            +
            kiso_ = gene(kiso_,holiday,day,days)
         | 
| 125 | 
            +
            ```
         | 
2
誤字
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -27,7 +27,7 @@ | |
| 27 27 | 
             
                                else:
         | 
| 28 28 | 
             
                                    kiso.loc[i][l] = random.randint(1, 3)    #希望がなく、休日でなければ
         | 
| 29 29 | 
             
                        else:
         | 
| 30 | 
            -
                            holi -= 1                        #希望休の分の休 | 
| 30 | 
            +
                            holi -= 1                        #希望休の分の休みを引く
         | 
| 31 31 |  | 
| 32 32 | 
             
                    if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
         | 
| 33 33 |  | 
1
コードに説明を追加
    
        title	
    CHANGED
    
    | 
            File without changes
         | 
    
        body	
    CHANGED
    
    | @@ -10,44 +10,45 @@ | |
| 10 10 |  | 
| 11 11 | 
             
            ```
         | 
| 12 12 | 
             
            def gene(kiso, holiday, day, days):
         | 
| 13 | 
            -
                count = 0
         | 
| 13 | 
            +
                count = 0                 
         | 
| 14 | 
            -
                for i in range( | 
| 14 | 
            +
                for i in range(len(kiso.index)):         #今回では40回分(午前午後含む)を処理
         | 
| 15 15 | 
             
                    if i % 2 == 0: 
         | 
| 16 | 
            -
                        holi = holiday.loc[i / 2][0]     
         | 
| 16 | 
            +
                        holi = holiday.loc[i / 2][0]     #2回に1回1人分の休日数を取得
         | 
| 17 17 |  | 
| 18 18 | 
             
                    count += 1
         | 
| 19 | 
            -
                    for l in range(1, days + 1):
         | 
| 19 | 
            +
                    for l in range(1, days + 1):         #1人分の午前、午後のどちらかを埋める(午前から)
         | 
| 20 | 
            -
                        d = day.loc[1][l]
         | 
| 20 | 
            +
                        d = day.loc[1][l]                #土日か平日を取得
         | 
| 21 | 
            -
                        g = kiso.loc[i][l]
         | 
| 21 | 
            +
                        g = kiso.loc[i][l]               
         | 
| 22 | 
            -
                        if g != 4:
         | 
| 22 | 
            +
                        if g != 4:                       
         | 
| 23 | 
            -
                            if  | 
| 23 | 
            +
                            if g != 1 and g != 2 and g != 3: 
         | 
| 24 | 
            +
                                if d == 0:                    #希望休がなく社員の希望もなしで、休日なら
         | 
| 24 | 
            -
             | 
| 25 | 
            +
                                    kiso.loc[i][l] = 0       #休みする
         | 
| 25 | 
            -
             | 
| 26 | 
            +
                                    holi -= 1                #2回に1回取得するholiから1を引く
         | 
| 26 | 
            -
             | 
| 27 | 
            +
                                else:
         | 
| 27 | 
            -
             | 
| 28 | 
            +
                                    kiso.loc[i][l] = random.randint(1, 3)    #希望がなく、休日でなければ
         | 
| 28 29 | 
             
                        else:
         | 
| 29 | 
            -
                            holi -= 1
         | 
| 30 | 
            +
                            holi -= 1                        #希望休の分の休むを引く
         | 
| 30 31 |  | 
| 31 | 
            -
                    if count % 2 == 0 and holi >= 1:
         | 
| 32 | 
            +
                    if count % 2 == 0 and holi >= 1:     #1人の人の午後の処理も終わり、休みが半日でも残っていれば
         | 
| 32 33 |  | 
| 33 | 
            -
                        for k in range(holi):
         | 
| 34 | 
            +
                        for k in range(holi):         #残っている休みの数だけループ
         | 
| 34 | 
            -
                            while True:
         | 
| 35 | 
            +
                            while True:                      #必ず休みを消化するためwhile
         | 
| 35 | 
            -
                                o = random.randint(0, 1)
         | 
| 36 | 
            +
                                o = random.randint(0, 1)      #午前と午後のどちらかを選ぶ
         | 
| 36 | 
            -
                                r = random.randint(1, days)
         | 
| 37 | 
            +
                                r = random.randint(1, days)   #1日から31日の中で選ぶ
         | 
| 37 | 
            -
                                if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:
         | 
| 38 | 
            +
                                if kiso.loc[i - o][r] != 0 and kiso.loc[i - o][r] != 4:  #上2つのo,rのところが休みでも希望休でもなければ
         | 
| 38 | 
            -
                                    
         | 
| 39 | 
            -
                                    kiso.loc[i - o][r] = 0
         | 
| 39 | 
            +
                                    kiso.loc[i - o][r] = 0   #o,rのところを休みに
         | 
| 40 | 
            -
                                   
         | 
| 41 | 
            -
             | 
| 40 | 
            +
                                    break
         | 
| 42 41 |  | 
| 43 42 | 
             
                return kiso
         | 
| 44 43 |  | 
| 45 44 |  | 
| 46 45 | 
             
            dateframe = gene(kiso_,holiday,day,days)#ここをfor文で2回実行(appendで追加)
         | 
| 47 46 | 
             
            ```
         | 
| 47 | 
            +
            kiso_ 実際は20人分ですが、午前と午後を分けるために40個になっています また、1,2,3はそれぞれの部署?を意味しています
         | 
| 48 | 
            -
             | 
| 48 | 
            +
            
         | 
| 49 | 
            -
            holiday
         | 
| 49 | 
            +
            holiday 休日数は半日で1回のため20人分です
         | 
| 50 | 
            +
             | 
| 50 | 
            -
            day
         | 
| 51 | 
            +
            day 土曜と日曜を休日にするために0にしています
         | 
| 51 52 | 
             
            days その月の日数
         | 
| 52 53 | 
             
            ### 試したこと
         | 
| 53 54 | 
             
            for文を使わずに2回書いて実行してみましたが解決しませんでした。
         | 
