我想创建一个不会覆盖现有数据帧的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
答案 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)
不要不必要地创建变量。请改用dict
或list
,例如通过字典或列表理解。
或者,考虑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)]