2016-11-23 2 views
3
df = pd.DataFrame({ 
    'A': ['d','d','d','f','f','f','g','g','g','h','h','h'], 
    'B': [5,5,6,7,5,6,6,7,7,6,7,7], 
    'C': [1,1,1,1,1,1,1,1,1,1,1,1], 
    'S': [2012,2013,2014,2015,2016,2012,2013,2014,2015,2016,2012,2013]  
    }); 

df = (df.B + df.C).groupby([df.A,df.S]).agg(['sum','size']). 
     unstack(fill_value=0) 
df10 = (df.B * df.C).groupby([df.A,df.S]).agg(['sum','size']). 
     unstack(fill_value=0) 
df20 = (df.B - df.C).groupby([df.A,df.S]).agg(['sum','size']). 
     unstack(fill_value=0) 

Могу ли я запустить следующий код за один раз для df, df10, df20? Btw, в реальных данных я буду запускать 80 кадров данных с тем же кодом, что и ниже;Можно ли создать несколько ячеек данных за один раз?

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] 

ответ

1
b_c_idx_locs = [df.columns.get_loc('B'), df.columns.get_loc('C')] 

a = df.values[:, b_c_idx_locs] 

df['B+C'] = a.sum(1) 
df['B*C'] = a.prod(1) 
df['B-C'] = -np.diff(a) 
cols = ['B+C', 'B*C', 'B-C'] 

df.groupby(['A', 'S'])[cols].agg(['sum', 'size']) 

enter image description here

+0

Спасибо. Можно ли иметь годы как столбцы? Кроме того, как мне внести поправки в дополнительный код, чтобы вернуть итоговые суммы и размер? – Zanshin

+0

'reset_index ('S')', чтобы получить годы как столбцы. присвойте результат выше 'df_', затем' df_.append (df_.sum(). rename (('Total', ''))) ' – piRSquared

Смежные вопросы