[Python][Pandas] 既存のDataFrameをPythonのコードとして生成する


この記事について

こちらのサイトなどでデータフレームを含むサンプルコードを載せるとき、エクセルなどから読み込むようにすると、他の読者が再現するにはそのエクセルもダウンロードして指定のフォルダに設置したりと少々手間になります。やはり、1回でコピペして、そのまま使えるコードにしたい時があります。

そこでStackoverflowで見つけた記事を参考に解決したので、少し改造して備忘録として残します。

具体的なイメージ

作られたデータフレーム(matplotlibのグラフ作成用に乱数で作成されたもの)

このデータフレームのコードを自動生成するとこうなる (長いので5日分にしてあります)

df = pd.DataFrame( {'A': {Timestamp('2000-01-01 00:00:00', freq='D'): -0.24881158810034185, Timestamp('2000-01-02 00:00:00', freq='D'): 0.07139047448061933, Timestamp('2000-01-03 00:00:00', freq='D'): 0.7792494446543436, Timestamp('2000-01-04 00:00:00', freq='D'): 1.0926570461659868, Timestamp('2000-01-05 00:00:00', freq='D'): 1.4520142696441036}, 'B': {Timestamp('2000-01-01 00:00:00', freq='D'): 0.5817934065331478, Timestamp('2000-01-02 00:00:00', freq='D'): 0.8533763338638953, Timestamp('2000-01-03 00:00:00', freq='D'): 0.16659791062591178, Timestamp('2000-01-04 00:00:00', freq='D'): 0.5581757315241185, Timestamp('2000-01-05 00:00:00', freq='D'): -0.6902489397676232}, 'C': {Timestamp('2000-01-01 00:00:00', freq='D'): -0.3335776649606007, Timestamp('2000-01-02 00:00:00', freq='D'): -1.18455668668358, Timestamp('2000-01-03 00:00:00', freq='D'): -1.4501306123185926, Timestamp('2000-01-04 00:00:00', freq='D'): -1.5626229346381093, Timestamp('2000-01-05 00:00:00', freq='D'): -0.5804342291361944}, 'D': {Timestamp('2000-01-01 00:00:00', freq='D'): 0.6181390369995523, Timestamp('2000-01-02 00:00:00', freq='D'): 0.16283679813751623, Timestamp('2000-01-03 00:00:00', freq='D'): -0.5992032302751686, Timestamp('2000-01-04 00:00:00', freq='D'): -0.595387504534234, Timestamp('2000-01-05 00:00:00', freq='D'): -1.266286634818076}} )

データを見やすいように整形することも考えましたが、目的はただコピペしてDataFrameができるようにするだけなので、改行せずに出力することにしました。まあ、面倒だったのもありますが・・(^^ゞ

作ったコード

import matplotlib.pyplot as plt
import pandas as pd

days=10
df = pd.DataFrame(np.random.randn(days, 4), index=pd.date_range("1/1/2000", periods=days), columns=list("ABCD")).cumsum()
plt.figure();
df.plot();
display (df)
print ("df = pd.DataFrame(", str(df.to_dict()), ")")

ポイントは最後の1行だけ、df.to_dict()で展開します。
表示されたものをコピペして、そのままコードに取り込めます。

参考にしたサイト

Matplotlibのグラフのサイト
https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html

Stack Overflow: Pandas Dataframe to Code
https://stackoverflow.com/questions/41769882/pandas-dataframe-to-code

追記:注意

精製されたデータフレームはTimeStampがあるので、この一文を入れないとエラーがでます
from pandas import Timestamp

今一つの例でしたので、以下に4都市の月別平均気温の推移のdataframeの例を載せておきます。
dfで読み込み、df2用のコードして吐き出すというものです。こちらの方がシンプルです。

import pandas as pd

df= pd.DataFrame( {'city': {0: '東京', 1: '名古屋', 2: '札幌', 3: '大阪'}, '1月': {0: 5.2, 1: 4.5, 2: -3.6, 3: 6.0}, '2月': {0: 5.7, 1: 5.2, 2: -3.1, 3: 6.3}, '3月': {0: 8.7, 1: 8.7, 2: 0.6, 3: 9.4}, '4月': {0: 13.9, 1: 14.4, 2: 7.1, 3: 15.1}, '5月': {0: 18.2, 1: 18.9, 2: 12.4, 3: 19.7}, '6月': {0: 21.4, 1: 22.7, 2: 16.7, 3: 23.5}, '7月': {0: 25.0, 1: 26.4, 2: 20.5, 3: 27.4}, '8月': {0: 26.4, 1: 27.8, 2: 22.3, 3: 28.8}, '9月': {0: 22.8, 1: 24.1, 2: 18.1, 3: 25.0}, '10月': {0: 17.5, 1: 18.1, 2: 11.8, 3: 19.0}, '11月': {0: 12.1, 1: 12.2, 2: 4.9, 3: 13.6}, '12月': {0: 7.6, 1: 7.0, 2: -0.9, 3: 8.6}} )
display(df)
print ("df2 = pd.DataFrame(", str(df.to_dict()), ")")

こちらを実行すると次のように表示されるはずで、まあ、それは上のコードのdfを定義するものと同じ内容です。

df2 = pd.DataFrame( {'city': {0: '東京', 1: '名古屋', 2: '札幌', 3: '大阪'}, '1月': {0: 5.2, 1: 4.5, 2: -3.6, 3: 6.0}, '2月': {0: 5.7, 1: 5.2, 2: -3.1, 3: 6.3}, '3月': {0: 8.7, 1: 8.7, 2: 0.6, 3: 9.4}, '4月': {0: 13.9, 1: 14.4, 2: 7.1, 3: 15.1}, '5月': {0: 18.2, 1: 18.9, 2: 12.4, 3: 19.7}, '6月': {0: 21.4, 1: 22.7, 2: 16.7, 3: 23.5}, '7月': {0: 25.0, 1: 26.4, 2: 20.5, 3: 27.4}, '8月': {0: 26.4, 1: 27.8, 2: 22.3, 3: 28.8}, '9月': {0: 22.8, 1: 24.1, 2: 18.1, 3: 25.0}, '10月': {0: 17.5, 1: 18.1, 2: 11.8, 3: 19.0}, '11月': {0: 12.1, 1: 12.2, 2: 4.9, 3: 13.6}, '12月': {0: 7.6, 1: 7.0, 2: -0.9, 3: 8.6}} )