1
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-30

この記事について

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

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

具体的なイメージ

作られたデータフレーム(matplotlibのグラフ作成用に乱数で作成されたもの)
スクリーンショット 2021-01-30 102835.png

このデータフレームのコードを自動生成するとこうなる (長いので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}} )

1
3
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
3