2017-09-13 91 views
-1

對於上下文,我試圖構建一個腳本來輸出有關內存中的DataFrame的信息。從字符串中調用熊貓數據框函數

我有一個DataFrame與列出的所有數據幀(dflist)。我想獲得Dataframe的名稱來調用一個函數。例如df1.shape。我遇到系統將df1視爲字符串的問題。

dflist
|名稱|
| df1 |
| df2 |

謝謝。

+0

你能共享與您構造dataframes的數據幀的代碼.. – MedAli

+1

爲什麼不把數據框放在列表中,而不是名稱? –

+0

我不知道我能做到這一點,你能分享嗎?這不會開始消耗更多的內存嗎?我在看一些漂亮的大桌子。處理不是問題。 – RMichalowski

回答

0

我假設你的意思是你有一個與內存中的數據幀對應的DataFrame名稱列表。無論如何,eval函數就是你正在尋找的東西。

import pandas as pd 

df1 = pd.DataFrame([0, 1]) 
df2 = pd.DataFrame([2, 3]) 
df3 = pd.DataFrame([4, 5]) 

list_of_names = ['df1', 'df2', 'df3'] 

[print(eval(x).shape) for x in list_of_names] 
+0

使用'eval()'是個好主意。 –

+0

@NilsWerner,你能否詳細說明一下? – PejoPhylo

+0

它是不安全的,因爲它可以讓你執行任意代碼,並且不會表達你實際想要做的事情:'eval(x)'可以是任何東西,而'locals()[x]'是局部變量的名字'x'。 –

3

您可以使用locals(),它返回所有局部變量的字典,即

df1 

相同

locals()['df1'] 

所以你可以做

[locals()[x].shape for x in list_of_names] 
0

由於使用eval是不好的理念(Why is using 'eval' a bad practice?),我建議你使用字典:

import pandas as pd 
d = {} 
d['df1'] = pd.DataFrame([0, 1]) 
d['df2'] = pd.DataFrame([2, 3]) 
d['df3'] = pd.DataFrame([4, 5]) 

然後,你就可以通過dataframes迭代計算的形狀或適用的任何功能如下:

In [7]: d.keys() 
Out[7]: ['df1', 'df3', 'df2'] 

In [8]: [d[x].shape for x in d.keys()] 
Out[8]: [(2, 1), (2, 1), (2, 1)] 

的額外優點在於,可以很容易地,沒有額外的內存或速度損失訪問任何數據幀d [「DF1」]:

In [10]: timeit d['df1'] 
10000000 loops, best of 3: 29.2 ns per loop