對於上下文,我試圖構建一個腳本來輸出有關內存中的DataFrame的信息。從字符串中調用熊貓數據框函數
我有一個DataFrame與列出的所有數據幀(dflist)。我想獲得Dataframe的名稱來調用一個函數。例如df1.shape。我遇到系統將df1視爲字符串的問題。
dflist
|名稱|
| df1 |
| df2 |
謝謝。
對於上下文,我試圖構建一個腳本來輸出有關內存中的DataFrame的信息。從字符串中調用熊貓數據框函數
我有一個DataFrame與列出的所有數據幀(dflist)。我想獲得Dataframe的名稱來調用一個函數。例如df1.shape。我遇到系統將df1視爲字符串的問題。
dflist
|名稱|
| df1 |
| df2 |
謝謝。
我假設你的意思是你有一個與內存中的數據幀對應的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]
使用'eval()'是個好主意。 –
@NilsWerner,你能否詳細說明一下? – PejoPhylo
它是不安全的,因爲它可以讓你執行任意代碼,並且不會表達你實際想要做的事情:'eval(x)'可以是任何東西,而'locals()[x]'是局部變量的名字'x'。 –
您可以使用locals()
,它返回所有局部變量的字典,即
df1
相同
locals()['df1']
所以你可以做
[locals()[x].shape for x in list_of_names]
由於使用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
你能共享與您構造dataframes的數據幀的代碼.. – MedAli
爲什麼不把數據框放在列表中,而不是名稱? –
我不知道我能做到這一點,你能分享嗎?這不會開始消耗更多的內存嗎?我在看一些漂亮的大桌子。處理不是問題。 – RMichalowski