Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 需要基于某些筛选器在嵌套for循环中创建多个数据帧_Python_Python 3.x_Pandas_Dataframe_Nested - Fatal编程技术网

Python 需要基于某些筛选器在嵌套for循环中创建多个数据帧

Python 需要基于某些筛选器在嵌套for循环中创建多个数据帧,python,python-3.x,pandas,dataframe,nested,Python,Python 3.x,Pandas,Dataframe,Nested,我有证券的主要原始数据,从中我需要根据某些筛选标准创建多个证券投资组合。我已经习惯了C++的工作,不太清楚下面的是如何在Python中实现的。 我尝试使用嵌套for循环生成不同的数据帧: i-用于循环从2007年到2017年的年份(原始数据中的yr列) j-用于循环1到4的区域(原始数据中的列区域) 我需要创建不同的数据帧,然后在这些数据帧上应用一些函数: 基本上,流程是: 步骤1:Yr过滤器--> 步骤2:区域过滤器--> 步骤3:计算该年份和地区的平均E分数值、平均P分数值、平均Q分数值--

我有证券的主要原始数据,从中我需要根据某些筛选标准创建多个证券投资组合。我已经习惯了C++的工作,不太清楚下面的是如何在Python中实现的。 我尝试使用嵌套for循环生成不同的数据帧:

i
-用于循环从2007年到2017年的年份(原始数据中的yr列)

j
-用于循环1到4的区域(原始数据中的列区域)

我需要创建不同的数据帧,然后在这些数据帧上应用一些函数: 基本上,流程是: 步骤1:Yr过滤器--> 步骤2:区域过滤器--> 步骤3:计算该年份和地区的平均E分数值、平均P分数值、平均Q分数值-->(E、P、Q是不同的列) 步骤4:按平均E分数的降序排列证券--> 第5步:选择前50名证券并将其放入数据框中

对p和Q分数也重复步骤4和5

基本上创建10*4*3数据帧

然后,这些数据帧可用于回测目的


任何帮助都将不胜感激。谢谢

您可以使用字典来存储数据帧。这还具有启用O(1)查找和分组相关数据的附加好处。您不需要为此使用嵌套循环,您可以将
dict
+
groupby
与输入数据帧
df
一起使用:

for k, v in df.groupby(['yr', 'region']):
    print(v)
dfs = dict(tuple(df.groupby(['yr', 'region']))
这将创建一个字典,将“yr”和“region”的每个组合映射到一个数据帧。您可以通过
d[(2010,1)]
访问2010年和地区1的数据帧

现在,要修改数据帧,只需像迭代任何其他字典一样迭代字典:

ETOP, PTOP, QTOP = {}, {}, {}

for key in dfs:
    dfs[key] = dfs[key].join(dfco.groupby('ISSUER_NAME')['E_SCORE'].mean(), ...)
    ...
    dfs[key]= dfs[key].drop_duplicates(subset=['ISSUER_NAME'], keep=False)
    ...
    E = dfs[key].sort_values('E_SCORE_ry', ascending = False)
    ETOP[key] = E.head(50)
    ...

注意,我创建了字典
ETOP
PTOP
QTOP
,用于存储结果数据帧,每个数据帧由相同的
('yr','region')
键结构索引。通过这种方式,您可以轻松访问、修改或组合任何特定组合的结果。

感谢您的帮助。我需要创建不同的数据帧,然后在这些数据帧上应用几个函数:基本上,流程是:Yr filter-->Region filter-->计算该Yr和Region的平均E分数值-->按平均E分数的降序排列证券-->选择前50个证券并将其放入数据帧中这些数据帧可以用于回溯测试。请添加对代码的解释,这将大大提高答案的质量。什么不起作用/需要修复?感谢您的回复Joerg。我不知道如何在嵌套for循环中创建数据帧。在上面的代码中,我无法动态创建名为dfij(->df20071 for eg)的数据帧。我知道这可以在字典里完成,但我不确定这是怎么回事。谢谢jpp。第行:dfs[key]=dfs[key]。删除重复项(子集=['ISSUER\u NAME',保留=False)。如何在不区分大小写的情况下删除重复项?您可以使用
dfs[key]=dfs[key][~dfs[key]['ISSUER\u NAME'].str.lower().duplicated()]
。有关更多详细信息,请参阅。
ETOP, PTOP, QTOP = {}, {}, {}

for key in dfs:
    dfs[key] = dfs[key].join(dfco.groupby('ISSUER_NAME')['E_SCORE'].mean(), ...)
    ...
    dfs[key]= dfs[key].drop_duplicates(subset=['ISSUER_NAME'], keep=False)
    ...
    E = dfs[key].sort_values('E_SCORE_ry', ascending = False)
    ETOP[key] = E.head(50)
    ...