首页 > 解决方案 > 迭代使用“locals”生成的几个数据帧:Python

问题描述

我已将数据帧“df”拆分为较小的数据帧 df1、df2...dfn,以便将具有相同 ID(来自“UNIT-ID”列)的所有记录组合在一起并存储在这些较小的数据帧中。

Input:

UNIT-ID Q1  Q2  Q3
110-P1  37  487 0
110-P1  31  140 1
110-P1  46  214 1
110-P2  29  287 1
110-P2  45  131 1
110-P2  39  260 0
110-15  23  346 0
110-15  31  419 1
110-15  37  287 0
110-15  36  228 1
110-15  48  309 1

Output:
df1:        
 UNIT-ID    Q1  Q2  Q3
    110-P1  37  487 0
    110-P1  31  140 1
    110-P1  46  214 1

df2:            
 UNIT-ID    Q1  Q2  Q3
    110-P2  29  287 1
    110-P2  45  131 1
    110-P2  39  260 0

感谢@WB回答了这个问题,我已经使用下面的代码来实现这一点。

variables = locals()
for i,j in enumerate(df.groupby('UNIT-ID')):
    variables["df{0}".format(i+1)] = j[1]
df1
Out[13]: 
   UNIT-ID  Q1   Q2  Q3
16  110-15  23  346   0
17  110-15  31  419   1
18  110-15  37  287   0
19  110-15  36  228   1
20  110-15  48  309   1

接下来,我想对这些单独的数据帧中的每一个运行几个预处理步骤和深度学习模型,现在,这些数据帧 - df1、df2.. dfn 没有存储在本地驱动器上的任何位置,但是这些已经创建并且如果选中,可以解决。有没有办法遍历这些数据帧?

可以使用“dict”划分为 df1、df2...dfn,如下所示,但使用此选项,我需要将每个 df 保存在物理位置并再次读取,因为 dfs 仍存储在 dict 中并且必须通过单独调用来提取。有没有办法使用“本地人”或任何其他技术来完成这项任务?

d={"df{0}".format(i+1):j[1]for i,j in enumerate(df.groupby('UNIT-ID'))}
d['df1']
Out[17]: 
   UNIT-ID  Q1   Q2  Q3
16  110-15  23  346   0
17  110-15  31  419   1
18  110-15  37  287   0
19  110-15  36  228   1
20  110-15  48  309   1

标签: pythonpandasdataframe

解决方案


您可以尝试遍历所有代码变量,按名称选择作为“子数据框”的变量(例如,在其名称中使用模式,例如subDf),然后它们仅在这些变量中执行某些操作。为了使我的想法更清楚,请运行以下示例:

variables = locals()
for i,j in enumerate(df.groupby('UNIT-ID')):
    variables["subDf{0}".format(i+1)] = j[1]

for each in [v for k,v in variables.items() if 'subDf' in k]:
    print(v)

#output:
#   UNIT-ID  Q1   Q2  Q3
#6   110-15  23  346   0
#7   110-15  31  419   1
#8   110-15  37  287   0
#9   110-15  36  228   1
#10  110-15  48  309   1


#  UNIT-ID  Q1   Q2  Q3
#0  110-P1  37  487   0
#1  110-P1  31  140   1
#2  110-P1  46  214   1


#  UNIT-ID  Q1   Q2  Q3
#3  110-P2  29  287   1
#4  110-P2  45  131   1
#5  110-P2  39  260   0

这样,您可以打印所有子数据帧,而无需将它们保存在其他地方。由于我不确定您打算如何处理您的数据,因此我无法判断这是否是最佳方法。但肯定会遍历您创建的数据框!


推荐阅读