如何在for循环中创建多个新数据框?

时间:2018-10-01 20:02:14

标签: python pandas

我想创建一个不会覆盖现有数据帧的for_loop吗?

for df in 2011, 2012, 2013:
       df = pd.pivot_table(df, index=["income"], columns=["area"], values=["id"], aggfunc='count')

现在,上面的for循环在每个现有数据帧上进行迭代。我该如何做,以便for循环创建一堆新的数据帧?

2011_pivot, 2012_pivot, 2013_pivot

3 个答案:

答案 0 :(得分:2)

我通常不鼓励您创建大量具有相关名称的变量,这在Python中是一种危险的设计模式(尽管在SAS中很常见)。更好的选择是创建一个数据帧字典,并以键作为您的“变量名”

df_dict = dict()
for df in 2011, 2012, 2013:
   df_dict["pivot_"+df.name] = pd.pivot_table(df, index=["income"], columns=["area"], values=["id"], aggfunc='count')

我在这里假设您的数据框的名称为“ 2011”,“ 2012”,“ 2013”​​

答案 1 :(得分:1)

除了创建数据框列表或字典之外,我看不到其他任何方法,否则必须手动命名。

df_list = [pd.pivot_table(df, index=["income"], columns=["area"], values=["id"], aggfunc='count') for df in 2011, 2012, 2013]

您可以找到示例here

答案 2 :(得分:0)

不要不必要地创建变量。请改用dictlist,例如通过字典或列表理解。

或者,考虑MultiIndex列和一个pd.pivot_table调用:

dfs = {2011: df_2011, 2012: df_2012, 2013: df_2013}
comb = pd.concat([v.assign(year=k) for k, v in dfs.items()], ignore_index=True)

df = pd.pivot_table(comb, index='income', columns=['year', 'area'],
                    values='id', aggfunc='count')

然后,您可以使用常规索引方法来过滤特定年份,例如

pivot_2011 = df.iloc[:, df.columns.get_level_values(0).eq(2011)]