在groupby循环中编号和创建数据框

时间:2018-11-13 15:41:00

标签: python pandas dataframe

我正在尝试编写一个函数,将一个数据帧“ df”拆分为较小的数据帧df1,df2 ... dfn,以便将具有相同ID(来自“ UNIT-ID”列)的所有记录组合在一起并存储在那些较小的数据框中,分别在文件夹中。 我希望它们命名为df1,df2..dfn

for i, g in df.groupby('ORISPL-UNIT'):
     df['df' + **<loops to number the dataframes>** ] = g

我希望用df后的数字1,2,3..n来命名数据帧。我该如何在循环中执行此操作?当groupby由groupby函数形成时,我希望在循环中创建数据框。

昨天我曾问过一个类似的question,但有一位成员标记为重复。我正在尝试更具体地说明我想如何在此问题中处理问题

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-P5  13  413 1
110-P5  13  259 1
110-P5  16  226 1
110-P5  49  456 1
110-P5  39  275 1
110-P10 41  189 0
110-P10 32  269 0
110-P10 31  123 1
110-P10 32  487 0
110-P10 24  398 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

df3:        
 UNIT-ID    Q1  Q2  Q3
    110-P5  13  413 1
    110-P5  13  259 1
    110-P5  16  226 1
    110-P5  49  456 1
    110-P5  39  275 1

df4:        
 UNIT-ID    Q1  Q2  Q3
    110-P10 41  189 0
    110-P10 32  269 0
    110-P10 31  123 1
    110-P10 32  487 0
    110-P10 24  398 0

df5:        
 UNIT-ID    Q1  Q2  Q3
    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
    110-15  34  390 1
    110-15  67  238 1

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

使用locals可以通过不推荐的方式完成工作,您可以使用dict来存储数据帧

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

使用字典

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