在ipython中,如何获得特定类型和模式的所有局部变量的列表?

2024-10-06 12:21:07 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我在工作空间中创建了5pd.DataFrame,它们是:

trade_i = pd.DataFrame(np.random.rand(5, 2))
trade_xt = pd.DataFrame(np.random.rand(5, 2))
trade_mmt = pd.DataFrame(np.random.rand(5, 2))
trade_pg = pd.DataFrame(np.random.rand(5, 2))
trade_fg = pd.DataFrame(np.random.rand(5, 2))

如您所见,这些类型都是pandas.core.frame.DataFrame,而startswith trade_

type(trade_fg)
Out[508]: pandas.core.frame.DataFrame

那么,我怎样才能返回它们的列表呢?不仅仅返回列表中变量的名称。你知道吗

到目前为止,我可以在如下列表中获得变量startswtihtrade_的名称:

df_list = [x for x in dir() if x.startswith('trade_')]
df_list
Out[514]: 
['trade_i',
 'trade_xt',
 'trade_mmt',
 'trade_pg',
 'trade_fg']

但这不是我想要的。 顺便说一下,我想在一个列表中返回这些数据帧变量的原因是为每个变量添加一列。你知道吗


Tags: coredataframepandas列表nprandomframepd
2条回答

因为您只使用自己创建的字符串,所以可以安全地使用eval来获取它们的值:

local_trade_variables = {x:eval(x) for x in dir() if x.startswith('trade_')}

制作名值词典

或者可以直接使用locals(),而不使用dir(),因为dir()已经是局部变量的字典:

local_trade_variables = {key:val for key,val in locals().items() if key.startswith('trade_')}

您可以使用eval()按名称接收变量的引用,并使用isinstance()检查它是否是DataFrame,如下所示:

[eval(v) for v in dir() 
 if isinstance(eval(v), pd.DataFrame) and v.startswith('trade_')]

正如所建议的那样,您可能需要创建一个字典—除非您不需要该名称信息。在这种情况下,一份清单就足够了:

import pandas as pd

df = pd.DataFrame([4,5,6])
trade_df = pd.DataFrame([1,2,3])

data_frames = dict([(v, eval(v)) for v in dir() 
                    if isinstance(eval(v), pd.DataFrame) and v.startswith('trade_')])

相关问题 更多 >