2016-11-15 11 views
0

私は、このようなDF2などDF1、などいくつかのデータフレームを、持っているし、私は今lst = ['df1', 'df2']dfの名前文字列をdfに変換するには?

のようなこれらのdfのの名前のリストを作った、私は、関数内でこれらのdfのを使いたい「my_func()」

my_func(dataframe=df1) 

my_func(dataframe=df2) 

...

私はmy_funcに異なるのDFさんを呼び出すことができるように、どのように私は、ループ内のデータフレームのリストを表現することができますか? (私はdfの代わりに文字列を呼び出しているので、下の方法は動作しません...)

for i in lst: 
    my_func(dataframe=i) 

ありがとう!

+1

(https://docs.python.org/3/tutorial/datastructures.html: – Torxed

+0

実際、多くのdfsで地球環境を溢れさせる必要はありません。辞書のように1つのインデックス付きオブジェクトにすべてを含みます。 – Parfait

答えて

1

データセットの名前を文字列として格納し、その文字列を引数として渡すと、生産性が低下すると主張します。

代わりに、すべてのデータセットを文字列キーの値として辞書を作成し、関数に辞書オブジェクトを渡します。

my_frames = {'df1' : [1,2,3], 'df2' : [4,5,6]} 

def my_func(dataframe): 
    ... do work on dataframe ... 

for df_name, df_obj in my_frames.items(): 
    print('Doing work on:', df_name) 
    my_func(df_obj) 

辞書や機能を備えたもう1つのすばらしい点は、名前の付いたパラメータをバットですぐに展開できることです。

my_frames = {'temperature' : 25.5, 'wind' : 4.6} 

def weather(temperature=None, wind=None): 
    print('The temp is:', temperature, 'and the wind speed is:', wind) 

weather(**my_frames) 

しかし、これはちょっとしたメモです。

for i in lst: 
    my_func(dataframe=eval(i)) 
あなたは[辞書]になっているはずです
+0

しかし、この場合、私はすべてのデータフレームを準備してあり、変換するために余分な作業をしたくありません。 –

+0

@GeorgeLiuそれらを変換する必要はありません、辞書はより多くのプレースホルダです/ storageユーティリティ。 'my_frames = {'df1':df1、 'df2':df2}'を実行することによって、リストをそのまま追加することができます。また、あなたのコードをリファクタリングして、正しい方法で終了するようにすることも賢明でしょう。もう一度それらを異なる方法で格納する必要はありません。最終的な結果は同じで、ビルド・ステップは同じであってもかまいませんが、おそらく異なるのは「どこに置いていますか」です。参照してください。 – Torxed

+0

だから、基本的には、dfはdictの値になる可能性があると言っていますよね? –

0

は、だから私は...ただのeval()を使用する必要があります考え出しました#dictionaries)を使用します。 `data_frames = {'df1':[]、 'df2':[]}`を実行すると、関数に直接アクセスして関数に渡すことができます。あなたはdata_frames.keys()の `dfのためにすることもできます:my_func(dataframe = my_dataframes [df])`
+2

あなたは 'eval()'を危険性を説明することなく使用したので、shitstormはコメントに注意してください。必要な理由を指定できない限り、実行しないでください。 [Pythonでevalを使うのは悪い習慣ですか?](http://stackoverflow.com/questions/1832940/is-using-eval-in-python-a-bad-practice) – Torxed

関連する問題