2016-08-02 7 views
0

私はthis codeを使用しました。これは動作しています。今すぐ小さい方の 'rep_list'を実行すると、リスト内の最初のRepがCPに追加されますが、AMに行くとCPが上書きされます。だから私はこのコードを実行すると実際には最後の人がループに保存されます。私がちょうど "CP"でコードを実行し、次に "AM"であれば、それはそれを追加する必要があります。 forループで何か問題がありますか?それともブック自体に問題がありますか?pandas dfをxlsxに書き込むときに、このループを正しく動作させるにはどうすればよいですか?

import pandas as pd 
import datetime 
from openpyxl import load_workbook 

now = datetime.datetime.now() 
currentDate = now.strftime("%Y-%m-%d") 
call_report = pd.read_excel("Ending 2016-07-30.xlsx", "raw_data") 

#rep_list = ["CP", "AM", "JB", "TT", "KE"] 
rep_list = ["CP", "AM"] 

def call_log_reader(rep_name): 
    rep_log = currentDate + "-" + rep_name + ".csv" 
    df = pd.read_csv(rep_log) 
    df = df.drop(['From Name', 'From Number', 'To Name/Reference', 'To Number', 'Billing Code', 'Original Dialed Number', 
    'First Hunt Group', 'Last Hunt Group'], axis=1) 
    df['rep'] = rep_name 

    book = load_workbook('Ending 2016-07-30.xlsx') 
    writer = pd.ExcelWriter('Ending 2016-07-30.xlsx', engine='openpyxl') 
    writer.book = book 
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets) 
    df.to_excel(writer, "raw_data", index=False) 
    writer.save() 
    ## I tried adding this : writer.close() hoping it would close the book and then force it to reopen for the next rep in the loop but it doesn't seem to work. 

for rep in rep_list: 
    call_log_reader(rep) 

ありがとうございました!

EDIT:

のGaurav Dhamaは、優れた仕事を偉大な答えを与えました。彼はパンダの執筆者(refer to this link)には少し制限があり、それぞれの担当者が最後に自分のシートを取得するという解決策を提案しました。これはうまくいきましたが、私はそれを考えた後、追加のシートを選び、制限が存在することを知ってこの解決策を思いつきました。基本的には、実際のXLSXファイルの代わりにCSVを追加し、最後にCSVを開いて大きなリストをXLSXファイルに追加しました。どちらの作品でも、最終製品がどのように見えるかによって異なります。

import pandas as pd 
import datetime 
from openpyxl import load_workbook 

now = datetime.datetime.now() 
currentDate = now.strftime("%Y-%m-%d") 
call_report = "Ending 2016-07-30.xlsx" 
#rep_list = ["CP", "AM", "JB", "TT", "KE"] 
rep_list = ["CP", "AM"] 
csv_to_xl_files = [] 
merged_csv = currentDate + "-master.csv" 

def call_log_reader(rep_name): 
    rep_log = currentDate + "-" + rep_name + ".csv" 
    df = pd.read_csv(rep_log) 
    df = df.drop(['TimestampDetail', 'Billing Code', 'From Name', 'From Number', 'To Name/Reference', 'To Number', 
       'Original Dialed Number', 'First Hunt Group', 'Last Hunt Group'], axis=1) 
    df['rep'] = rep_name 
    #print (df.head(3)) 
    df.to_csv(merged_csv, mode='a', index=False, header=False) 
    csv_to_xl_files.append(rep_log) 

book = load_workbook(call_report) 
writer = pd.ExcelWriter(call_report, engine='openpyxl') 
writer.book = book 
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) 

for rep in rep_list: 
    call_log_reader(rep) 

master_df = pd.read_csv(merged_csv) 
master_df.to_excel(writer, "raw_data", index=False) 
writer.save() 

#this csv_to_xl_files list isn't finished yet, basically I'm going to use it to delete the files from the directory as I don't need them once the script is run. 
print (csv_to_xl_files) 

答えて

1

次を使用してみてください:

import pandas as pd 
import datetime 
from openpyxl import load_workbook 

now = datetime.datetime.now() 
currentDate = now.strftime("%Y-%m-%d") 
call_report = pd.read_excel("Ending 2016-07-30.xlsx", "raw_data") 

#rep_list = ["CP", "AM", "JB", "TT", "KE"] 
rep_list = ["CP", "AM"] 

def call_log_reader(rep_name): 
    rep_log = currentDate + "-" + rep_name + ".csv" 
    df = pd.read_csv(rep_log) 
    df = df.drop(['From Name', 'From Number', 'To Name/Reference', 'To Number', 'Billing Code', 'Original Dialed Number', 
    'First Hunt Group', 'Last Hunt Group'], axis=1) 
    df['rep'] = rep_name 
    df.to_excel(writer, "raw_data"+rep, index=False) 
    return df 

book = load_workbook('Ending 2016-07-30.xlsx') 
writer = pd.ExcelWriter('Ending 2016-07-30.xlsx', engine='openpyxl') 
writer.book = book 
writer.sheets = dict((ws.title, ws) for ws in book.worksheets) 

for rep in rep_list: 
    call_log_reader(rep) 

writer.save() 
+0

"For"ループを呼び出す前に上記のコードブロックを置くと、エラーなしで実行されますが、ファイルには "raw_data"という空白のシートしかありません。関数の呼び出し後にforループの後にコードブロックを置くか、forループにNameErrorをスローします:グローバル名 'writer'は定義されていないため、完了しません。 – Mxracer888

+0

私は自分の答えを編集し、コード。これはあなたのために働くはずです。あなたが変数call_reportを読んでいる "Ending 2016-07-30.xlsx"のサンプルを投稿してください。 –

+0

ああ、pandas excelwriterに問題があります。同じシートに別のデータフレームを書くことはできません、それらは次々と上書きし続けます。この[リンク](https://github.com/pydata/pandas/issues/3441)を参照してください。複数のワークシートを生成するためにコードを再度編集しました。 –

関連する問題