80711


Python3でExcelファイルの行と列を入れ替えのですが、  
実現したい内容が上手くいかないので質問させて頂きます。  
ご指導をお願いできますでしょうか。

Excelのデータ

[code]

    No      国    　　　　都市               ディズニーランド有/無
    1       アメリカ      カリフォルニア      有
                          フロリダ　　　　　　有
    2       フランス      パリ　　　　        有
    3       日本          東京    　　　　    有
                          沖縄　　　　　　　　　
                          京都　　　　　　　　無
    4       ブラジル      サンパウロ          無
    
[/code]

### Excelの行と列を入れ替えたい内容

  1. 都市が幾つかがある場合、空白を削除して次の列に都市を移動したい
  2. 「ディズニーランド有/無」の列に無や空白がある場合も行を削除したい

[code]

    No（A列）     国（B列）   都市（C列）     都市2(D列）
    1             アメリカ    カリフォルニア  フロリダ
    2             フランス    パリ
    3             日本        東京　　　      
    
[/code]

下記のコードでやってみましたらこちらの結果が表示されます。

[code]

    都市             カリフォルニア  フロリダ    パリ  東京  沖縄  京都  サンパウロ
    ディズニーランド有/無 有         有      有   有      無     無
    
[/code]

コード

[code]

    #openpyxlモジュールを使用する
    import openpyxl
     
    #既存のExcelファイルを開く
    wb=openpyxl.load_workbook("test.xlsx")
    #既存ファイルのシートを指定
    sheet1=wb['Sheet1']
    #既存ファイルに新規シートをシート名と位置を指定して作成
    sheet2=wb.create_sheet(title='Sheet2',index=1)
     
    #Sheet1の値のある行数を取得
    rw=sheet1.max_row
    #Sheet1の値のある列数を取得
    cl=sheet1.max_column
     
    #iは値のある行数分繰り返す
    #jは値のある列数分繰り返す
    #range(start,stop)はstart≦i<stopでstopで指定した値は含まないので「+1」している
    for i in range(1,rw+1):
        for j in range(1,cl+1):
            C1=sheet1.cell(row=i,column=j) #sheet1のセルの行番号と列番号を指定している
            C2=sheet2.cell(row=j,column=i) #sheet1のセルの行番号と列番号を入れ替えてsheet2のセルを指定している
            C2.value=C1.value #sheet2のセルにsheet1のセルの値を代入
     
    wb.save("test.xlsx") #上書き保存
    
    # シートのロード
    ws = wb.worksheets[1]
    
    #シートの最終行を取得
    Sheet_Max = ws.max_row + 1
    
    #最終行から逆ループ
    for i in reversed(range(1,Sheet_Max)):
    
        GetValue1 = ws.cell(row=i, column=3).value
    
        #A列が None だったら
        if GetValue1 == None:
            #行削除
            ws.delete_rows(i)
        else:
            #C列の空白文字を削除
            GetValue2 = GetValue1.strip()
    
            #セルの文字数が 0 だったら
            if len(GetValue2) == 0:
                #行削除
                ws.delete_rows(i)
    
    wb.save("testdelete.xlsx") #上書き保存
    
[/code]


CC BY-SA 4.0
2021-08-10T02:51:04.973
80700
2021-08-10T21:42:17.333
2021-08-10T04:11:35.867
3060
18859
question
python python3 excel openpyxl
PythonのopenpyxlでExcelの行と列を入れ替え方法について


下記の方法でも解決できました。  
他に良い方法でもあれば、教授をお願い致します。

①同一国に複数の都市があったら、2つ目以後の都市名を後ろの列に移動し、1つの国では1つつの行だけする  
②ディズニーランド有/無の列の空白を削除する  
③ディズニーランド有/無の列の無だけを削除する

code

[code]

    import openpyxl
    
    # Excelファイルを開く
    wb = openpyxl.load_workbook("test.xlsx")
    ws = wb['Sheet1']
    
    # a列の次の行が空白の場合、前のa列を代入
    number = ''
    for i in range(2,ws.max_row+1):
        if ws['a'+str(i)].value is None or not str(ws['a'+str(i)].value).strip():
            ws['a'+str(i)].value = number
        else:
            number = ws['a'+str(i)].value
    
    # ｂ列の次の行が空白の場合、前のｂ列を代入
    country = ''
    for i in range(2,ws.max_row+1):
        if ws['b'+str(i)].value is None or not str(ws['b'+str(i)].value).strip():
            ws['b'+str(i)].value = country
        else:
            country = ws['b'+str(i)].value
    
    #シートの最終行を取得
    Sheet_Max = ws.max_row +1
    
    #最終行から逆ループ
    for i in reversed(range(Sheet_Max)):
    
        if i == 0:
            break
    
        #D列が空白だったら
        if ws.cell(row=i, column=4).value == None:
    
            #行削除
            ws.delete_rows(i)
    
    #別名で保存
    wb.save("test_delete1.xlsx")
    
    wb = openpyxl.load_workbook("test_delete1.xlsx")
    
    ws = wb['Sheet1']
    
    #シートの最終行を取得
    Sheet_Max = ws.max_row + 1
    
    #最終行から逆ループ
    for i in reversed(range(Sheet_Max)):
    
        if i == 0:
            break
    
        #D列に特定の値が含まれていたら
        if '無' in ws.cell(row=i, column=4).value:
    
            #行削除
            ws.delete_rows(i)
    
    wb.save("test_delete1.xlsx") #上書き保存
    
[/code]

結果

[code]

    1   アメリカ    カリフォルニア 有
    1   アメリカ    フロリダ    　　 有
    2   フランス    パリ          有
    3   日本      東京          有
    
    
[/code]


CC BY-SA 4.0
2021-08-10T09:36:08.723
80706
2021-08-10T09:36:08.723
18859
80700
answer


以下は Excel のシートを pandas のデータフレームに変換して
[pandas.DataFrame.fillna](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html#pandas.DataFrame.fillna)
の `method='ffill'` を使う方法です。

[code]

    import pandas as pd
    from openpyxl import Workbook, load_workbook
    from openpyxl.utils.dataframe import dataframe_to_rows
    
    pd.set_option('display.unicode.east_asian_width', True)
    
    wb = load_workbook('test.xlsx')
    ws = wb['Sheet1']
    
    # convert to pandas dataframe
    data = ws.values
    cols = next(data)
    df = pd.DataFrame(data, columns=cols)
    
    # fill in the forward
    df[['No', '国']] = df[['No', '国']].fillna(method='ffill')
    df.No = df.No.astype(int)
    
    # select data
    dfx = df[df['ディズニーランド有/無'] == '有']
    
    print(dfx.to_markdown(index=False))
    
    # save to a new sheet
    wb = Workbook()
    ws = wb.active
    
    for r in dataframe_to_rows(dfx, index=False, header=True):
      ws.append(r)
    
    wb.save('test_delete1.xlsx')
    
[/code]

**Dataframe dfx**

No | 国 | 都市 | ディズニーランド有/無  
---|---|---|---  
1 | アメリカ | カリフォルニア | 有  
1 | アメリカ | フロリダ | 有  
2 | フランス | パリ | 有  
3 | 日本 | 東京 | 有


CC BY-SA 4.0
2021-08-10T17:02:45.227
80711
2021-08-10T21:42:17.333
2021-08-10T21:42:17.333
47127
47127
80700
answer