1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[python]DataFrameを用いて任意の変数や配列をまとめてラベル付してcsvに保存[pandas]

Last updated at Posted at 2019-12-18

変数をまとめてラクに保存したいなーって思ったのでそういうプログラムを作りました。
2次元配列も応用すれば保存できます。

…書いてから気づいたけど追記のやり方の方が良さそうかも
忙しい方は追記へジャンプ
単純に全変数を保存したい場合はdillを用いたやり方で

追記の方法だと、型の関係か使おうとしたデータではエラーになりました。
DataFrameを使う方法だとエラーにならなかったので、
一度DataFrameを挟むのも無意味ではないのかも。

import pandas as pd

まずpandasをimportします


# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]

この関数、配列を保存します

# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

この関数を使うことで変数名をstrとして取得します
ほぼこちらの記事のコピペです
内容はこちらを参照ください

df = pd.DataFrame()

datas1 = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
    df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加

{名前:値}を元にDataFrameを作成してconcatでdfにどんどん追加保存していきます
axis = 1を入れることで横に追加となります

datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
    df =  pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加

先ほどと同様の事を行います
{名前:値}は配列である必要があるので[data]としています

df.to_csv('test.csv')
print(df)
del df

保存して表示します。
dfはいろいろなとこで使いがちなので削除も一応しておきます。

以下の表にちゃんと表示、保存出来ていることが分かります

   xx  yy  zz    a    b    c    d
0   3   5   8  1.0  2.0  3.0  4.0
1   6   8   2  NaN  NaN  NaN  NaN
2   8   2   8  NaN  NaN  NaN  NaN

ソースコード

import pandas as pd

# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]

# --- 変数をまとめてdataframeにしてcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

df = pd.DataFrame()

datas1 = [xx,yy,zz] # 変数名をヘッダーにしながら、1次元配列をまとめてdataframe化
for data in datas1:
    df = pd.concat([df, pd.DataFrame({getName(data):data})],axis=1) # {}集合を使ってdataframeをconcatで追加
    
datas2 = [a,b,c,d]# 変数名をヘッダーにしながら、変数をまとめてdataframe化
for data in datas2:
    df =  pd.concat([df, pd.DataFrame({getName(data):[data]})],axis=1)# {}集合を使ってdataframeをconcatで追加
df.to_csv('test.csv')
print(df)
del df

追記

直接csvに書き込む

# --- テスト用に変数を定義 ---
a ,b,c,d = 1,2,3,4
xx = [3,6,8]
yy = [5,8,2]
zz = [8,2,8]
import csv
# --- 変数を選んでcsv保存 ---
def getName(obj):
    return  [k for k, v in globals().items() if id(obj) == id(v)][0] # 変数名をstrでreturn

with open('test2.csv','a', newline="") as f:
    datas = [xx,yy,zz,]
    writer = csv.writer(f)
    for data in datas:
        writer.writerow([getName(data)]+data)
    datas = [a,b,c,d]
    for data in datas:
        writer.writerow([getName(data)]+[data])

場合分けは単一の変数をlist型に変換するため

出力 test2.csv

xx,3,6,8
yy,5,8,2
zz,8,2,8
a,1
b,2
c,3
d,4

dillを用いたやり方

保存


import dill
dill.dump_session('session.pkl')

読み込み

import dill
dill.load_session('session.pkl')

ですべての変数がそのまま使えます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?