Python 在循环中创建多个数据帧

Python 在循环中创建多个数据帧,python,pandas,Python,Pandas,我有人口数据。我想为每个州和年份创建单独的数据帧。其思路如下: for i in province_id: for j in year: sub_data_i_j = data[(data.provid==i) &(data.wave==j)] 但是,我不确定如何动态生成子数据。我认为最好的方法是创建数据帧的字典,首先通过以下方式进行过滤: 另一个解决方案: dfs = dict(tuple(df.groupby(df['provid'] + '_' + df

我有人口数据。我想为每个州和年份创建单独的数据帧。其思路如下:

for i in province_id:
    for j in year:
         sub_data_i_j = data[(data.provid==i) &(data.wave==j)]

但是,我不确定如何动态生成子数据。

我认为最好的方法是创建数据帧的
字典,首先通过以下方式进行过滤:

另一个解决方案:

dfs = dict(tuple(df.groupby(df['provid'] + '_' + df['wave'].astype(str))))

最后,您可以选择每个数据帧:

print (dfs['b_2004'])
   A  C  D  E provid  wave
5  f  3  0  4      b  2004
您的答案应通过以下方式更改:

sub_data = {}
province_id = ['a','b']
year = [2004]
for i in province_id:
    for j in year:
         sub_data[i + '_' + str(j)] = df[(df.provid==i) &(df.wave==j)]

print (sub_data)
{'a_2004':    A  C  D  E provid  wave
0  a  7  1  5      a  2004
2  c  9  5  6      a  2004, 'b_2004':    A  C  D  E provid  wave
5  f  3  0  4      b  2004}
我的建议是:

import io
import pandas as pd
from collections import defaultdict

string = u"""province_id,wave,value
1,2014,10
1,2014,10
1,2013,10
2,2010,10
3,2010,10"""

df = pd.read_csv(io.StringIO(string))

# Output:
d = defaultdict(dict)

# This splits the dataframe by province_id and wave
dfs = df.groupby(["province_id","wave"])

# Loop through the dataframes and stucture them
for ind,df in dfs:
    d[ind[0]][ind[1]] = df
生成的字典结构如下所示:

{
  "1": {
    "2013": "dataframe: 1 2013", 
    "2014": "dataframe: 1 2014"
  }, 
  "2": {
    "2010": "dataframe: 2 2010"
  }, 
  "3": {
    "2010": "dataframe: 3 2010"
  }
}
您可以通过以下方式访问数据帧:

d[1][2013]

这应该可以做到:

for i in province_id:
    for j in year:
        locals()['sub_data_{}_{}'.format(i,j)] = data[(data.provid==i) & (data.wave==j)]
我最初建议使用
exec
,出于安全原因,这通常不是最佳实践。话虽如此,如果您的代码没有暴露给任何有恶意意图的人,那么应该没有问题,为了完整起见,我将把它留在这里:

for i in province_id:
    for j in year:
        exec "sub_data_{}_{} = data[(data.provid==i) & (data.wave==j)]".format(i,j)
然而,对于大多数用例,最好使用某种类型的集合,例如字典,因为在代码的后续部分引用动态生成的变量名会很麻烦。它也是一条单行线:

data_dict = {key:g for key,g in data.groupby(['provid','wave'])}

当我发帖的时候,你已经得到了一个很好的答案。。。很好+1我的意思是,当我完成我的“答案”时,你已经得到了一个带有示例和“其他解决方案”的答案。谢谢你的详细回答!我同意。第二种方法更像是python。谢谢感谢您介绍defaultdict类。
for i in province_id:
    for j in year:
        exec "sub_data_{}_{} = data[(data.provid==i) & (data.wave==j)]".format(i,j)
data_dict = {key:g for key,g in data.groupby(['provid','wave'])}