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'])}