質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

700閲覧

python データフレームの取扱いに関して

ekTJ

総合スコア109

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/12/14 06:37

pythonでデータをCSV出力しようとしていますが、最後に躓いております。

目標形の様にカラム名は7列あるが、7列目は空欄にしカンマもダブルクォーテーションも表示しない。
要するに7列目は「" "」というスペースが入力された列名のみ入力されている状態にしたいです。

最後のCSVに出力する時にダブルクォーテーションを設定すればよいのでしょうか。
または、データフレームの段階で加工すれば良いのでしょうか。

宜しくお願い致します。

目標形(テキストで表示した) "SCAN","20201214","151942","20201214-151942","1400700","598255"," " "838","588","00","00","20200528","17" "838","804","00","00","20050823","16" "838","841","00","00","20120709","19"
現在形(テキストで表示した) "SCAN","20201214","151942","20201214-151942","1400700","598255"," " "838","588","00","00","20200528","17","" "838","804","00","00","20050823","16","" "838","841","00","00","20120709","19",""
データフレームの現在形 SCAN 20201214 151942 20201214-151942 1400700 598255 0 838 588 00 00 20200528 17 None 1 838 804 00 00 20050823 16 None 2 838 841 00 00 20120709 19 None 3 838 014 00 00 20181030 17 None 4 838 283 00 00 20190518 20 None

[参考]pythonスクリプト

python

1import tkinter as tk 2import tkinter.messagebox as tkm 3from tkinter import filedialog 4import pandas as pd 5import datetime as dt 6import cx_Oracle 7import os 8import csv 9 10USERID = "aaaaa" 11PASSWORD = "aaaaaa" 12DESTINATION = "aaaaaa" 13#時刻 14now = dt.datetime.now() 15time = now.strftime('%Y%m%d-%H%M%S') 16desktop_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\Desktop"+"\" 17 18def OpenFileDlg(tbox): 19 ftype = [('','*')] 20 dir = '.' 21 # ファイルダイアログ表示 22 filename = filedialog.askopenfilename(filetypes = ftype, initialdir = dir) 23 # ファイルパスをテキストボックスに表示 24 tbox.insert(0, filename) 25 26#ボタン関数 27def btn_click(): 28 cc=str(txt1.get()) 29 sc=str(txt2.get()) 30 SQL="select MAX(TNPMN) from HstKokMst WHERE KOKC = '" + cc + "'" 31 SQL2 = "select MAX(SYIMN1),MAX(syimn2) from HENSYIMST WHERE SYIC = '" + sc + "'" 32 33 34 if not len(cc) == 6 : 35 tkm.showerror("入力エラー", "顧客番号は6桁です") 36 return 37 elif not len(sc) == 7 : 38 tkm.showerror("入力エラー", "社員番号は7桁です") 39 return 40 elif file_text.get() == '': 41 tkm.showerror('エラー','データファイルを指定してください') 42 return 43 else: 44 with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection: 45 with connection.cursor() as cursor: 46 for row in cursor.execute(SQL): 47 if row == (None,): 48 tkm.showerror("エラー", "顧客番号に問題があります") 49 return 50 else: 51 row_replace = [rows.replace(' ', '')for rows in row] 52 kokyac = ''.join(row_replace) 53 with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection: 54 with connection.cursor() as cursor: 55 for row in cursor.execute(SQL2): 56 if row == (None,None): 57 tkm.showerror("エラー", "社員番号に問題があります") 58 return 59 else: 60 row_replace = [rows.replace(' ', '')for rows in row] 61 syain = ''.join(row_replace) 62 ques = tkm.askokcancel("確認", "店名:"+kokyac+"様\n""処理者:"+syain+"\nでCSVを出力しますか?") 63 if ques == False: 64 return 65 66 f = open(file_text.get(), 'r') 67 colspecs = [(22,25), (25,28),(28,30),(30,32),(22,32),(47,51),(22,28)] 68 names = ["SCAN", now.strftime("%Y%m%d"), now.strftime('%H%M%S'),now.strftime("%Y%m%d-%H%M%S"),sc,cc," "] 69 df = pd.read_fwf(f, skiprows=1,header=None, names=names,colspecs=colspecs,dtype=object) 70 df = df.dropna(subset=["SCAN"]) 71 72 f = open(file_text.get(), 'r') 73 colspecss = [(51,54),(54,57),(57,59),(59,61),(51,61),(72,76),(51,57)] 74 dfA = pd.read_fwf(f,header=None, names=names, colspecs=colspecss,dtype=object) 75 dfA = dfA.dropna(subset=["SCAN"]) 76 df_concat = pd.concat([df, dfA]) 77 df_concat[cc]=df_concat[cc].astype(int) 78 df_concat[cc] = df_concat.groupby(sc)[cc].transform('sum') 79 df_sum = df_concat.drop_duplicates(sc) 80 81 trk = df_concat[" "] 82 trk = ','.join(map(str,trk)) 83 SQL3 = "SELECT RHB,TRKH FROM ShnZok WHERE RHB IN" "(" + trk + ")" 84 dfC = pd.DataFrame() 85 86 with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as connection: 87 with connection.cursor() as cursor: 88 for row in cursor.execute(SQL3): 89 dfC = dfC.append([row]) 90 dfC=dfC.reset_index(drop=True) 91 dfD = pd.merge(df_sum,dfC,left_on = " ",right_on=0) 92 drop_col = [sc," ", 0] 93 df_result = dfD.drop(drop_col, axis=1) 94 df_result = df_result[["SCAN", now.strftime("%Y%m%d"), now.strftime('%H%M%S'),now.strftime("%Y%m%d-%H%M%S"),1,cc]] 95 df_result = df_result.rename(columns={1: sc}) 96 df_result[" "] = None 97 98 print(df_result) 99 100 df_result.to_csv(desktop_path+cc+"_{}.csv".format(time), index= False,encoding="shift-jis",quoting = csv.QUOTE_ALL) 101 tkm.showinfo("情報", "CSVを保存しました") 102 txt1.delete(0,tk.END) 103 file_text.delete(0,tk.END) 104 105#画面表示 106root = tk.Tk() 107root.geometry('500x400+600+300') 108root.title('入力画面') 109 110#顧客番号 111lbl1 = tk.Label(text='顧客番号',font=(u'MS ゴシック', 11, 'bold')) 112lbl1.place(x=85, y=145) 113txt1 = tk.Entry(width=30) 114txt1.place(x=160, y=150) 115 116#社員番号 117lbl2 = tk.Label(text='社員番号',font=(u'MS ゴシック', 11, 'bold')) 118lbl2.place(x=85, y=175) 119txt2 = tk.Entry(width=30) 120txt2.place(x=160, y=180) 121txt2.insert(tk.END,"社員番号7桁") 122 123# Excelファイルダイアログ 124label = tk.Label(root, text='データファイル',font=(u'MS ゴシック', 10, 'bold')) 125label.place(x=100, y=95) 126file_text = tk.Entry(root, width=40) 127file_text.place(x=100, y=115) 128fdlg_button = tk.Button(root, text='ファイル選択', command = lambda: OpenFileDlg(file_text) ) 129fdlg_button.place(x=360, y=110) 130 131#ボタン 132btn = tk.Button(root, text='CSV出力',width=20, font=("Menlo",11),command=btn_click) 133btn.place(x=155, y=220) 134 135btn1 = tk.Button(root, text="終了", width=20, font=("Menlo",11),command=root.destroy) 136btn1.place(x=155, y=250) 137 138root.mainloop() #表示保持

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ヘッダーと、データ部を分けて出力するとできそうです。

ヘッダー行の作成方法はいろいろあると思いますが、まじめにやると改行とかが面倒なので、元のデータフレームと同じカラムを持つ空のデータフレームを作成してto_csvすることでやっています。

python

1import csv 2import pandas as pd 3 4df = pd.DataFrame([ 5 [838, '588', '00', '00', '20200528', 17, None], 6 [838, '804', '00', '00', '20050823', 16, None], 7 [838, '841', '00', '00', '20120709', 19, None], 8 [838, '014', '00', '00', '20181030', 17, None], 9 [838, '283', '00', '00', '20190518', 20, None]], 10 columns=['SCAN', '20201214', '151942', '20201214-151942', '1400700', '598255', ' ']) 11 12csvfile = 'foo.csv' 13 14# ヘッダのみ出力 (空のデータフレーム) 15pd.DataFrame(columns=df.columns).to_csv(csvfile, index=False, quoting=csv.QUOTE_ALL) 16 17# 最後の列を除いて出力 (追記, ヘッダなし) 18df.iloc[:, :-1].to_csv(csvfile, mode='a', header=False, index=False, quoting=csv.QUOTE_ALL)

投稿2020/12/15 00:42

bsdfan

総合スコア4520

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ekTJ

2020/12/15 03:08

bsdfan様、ありがとうございます!!ファイル名など少し調整したところ完全に理想の形で出力することが出来ました! ヘッダとデータを分けて出力、追記でデータを記入する。とても勉強になりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問