2016-12-05 31 views
1

我想通过DF1和DF2的重命名(和代码)运行dataframes的列表。这可以通过def ....等,或任何其他方法来完成吗?创建和重命名dataframes动态

df = pd.DataFrame({ 
    'A': ['d','d','d','d','d','d','g','g','g','g','g','g','k','k','k','k','k','k'], 
    'B': [5,5,6,4,5,6,-6,7,7,6,-7,7,-8,7,-6,6,-7,50], 
    'C': [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2], 
    'S': [2012,2013,2014,2015,2016,2012,2012,2014,2015,2016,2012,2013,2012,2013,2014,2015,2016,2014]  
    }); 

df = (df.B + df.C).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0) 
df1 = df.groupby(level=0, axis=1).sum() 
new_cols= list(zip(df1.columns.get_level_values(0),['total'] * len(df.columns))) 
df1.columns = pd.MultiIndex.from_tuples(new_cols) 
df2 = pd.concat([df1,df], axis=1).sort_index(axis=1).sort_index(axis=1, level=1) 
df2.columns = ['_'.join((col[0], str(col[1]))) for col in df2.columns] 
df2.columns = df2.columns.str.replace('sum_','') 
df2.columns = df2.columns.str.replace('size_','T') 

回答

1

我想你可以使用自定义功能:

def func(df): 
    df = (df.B + df.C).groupby([df.A, df.S]).agg(['sum','size']).unstack(fill_value=0) 
    df1 = df.groupby(level=0, axis=1).sum() 
    new_cols= list(zip(df1.columns.get_level_values(0),['total'] * len(df.columns))) 
    df1.columns = pd.MultiIndex.from_tuples(new_cols) 
    df2 = pd.concat([df1,df], axis=1).sort_index(axis=1).sort_index(axis=1, level=1) 
    df2.columns = ['_'.join((col[0], str(col[1]))) for col in df2.columns] 
    df2.columns = df2.columns.str.replace('sum_','') 
    df2.columns = df2.columns.str.replace('size_','T') 
    return df2 

print (func(df))  
    T2012 2012 T2013 2013 T2014 2014 T2015 2015 T2016 2016 Ttotal \ 
A                    
d  2 13  1  6  1  7  1  5  1  6  6 
g  2 -11  1  8  1  8  1  8  1  7  6 
k  1 -6  1  9  2 48  1  8  1 -5  6 

    total 
A   
d  37 
g  20 
k  54  

如果需要procees多个dataframes:

for df in [df1,df2,df3]: 
    print (func(df)) 

如果需要输出到dataframes的列表:

dfs = [func(df) for df in [df1,df2,df3]] 
+0

喜jezrael,谢谢。其中一个问题是,我接受的DF的名称会保持原样吗? – Zanshin

+0

如果'DataFrames',您可以通过像'DFS [0]位置选择dataframes使用清单'是第一个数据帧,'DF [1]'是第二... dataframes的名单是非常好的,如果需要CONCAT所有dataframes在一起,然后只使用''df = pd.concat(dfs)' – jezrael

+0

好的,谢谢。但如果我不想,这个名字是否保持不变? – Zanshin