2017-10-06 78 views
2

我有数据帧熊猫:每N列的总和

ID 2016-01 2016-02 ... 2017-01 2017-02 ... 2017-10 2017-11 2017-12 
111 12  34   0  12   3  0  0 
222 0   32   5   5   0  0  0 

我需要计算每12列,并得到

ID 2016 2017 
111 46  15 
222 32  10 

我尝试使用

(df.groupby((np.arange(len(df.columns)) // 31) + 1, axis=1).sum().add_prefix('s')) 

但它返回到所有列 但是,当我尝试使用

df.groupby['ID']((np.arange(len(df.columns)) // 31) + 1, axis=1).sum().add_prefix('s')) 

它返回

TypeError: 'method' object is not subscriptable 

我该如何解决呢?

回答

4

首先列set_index没有日期:

df = df.set_index('ID') 

1.groupby通过split编列和第一选定:

df = df.groupby(df.columns.str.split('-').str[0], axis=1).sum() 

2.lambda为分割功能:

df = df.groupby(lambda x: x.split('-')[0], axis=1).sum() 

转换列日期时间和groupby年:

df.columns = pd.to_datetime(df.columns) 
df = df.groupby(df.columns.year, axis=1).sum() 

4.resample通过years

df.columns = pd.to_datetime(df.columns) 
df = df.resample('A', axis=1).sum() 
df.columns = df.columns.year 

print (df) 
    2016 2017 
ID    
111 46 15 
222 32 10 
0

如果你不介意丢失标签,你可以试试这个:

new_df = df.groupby([i//n for i in range(0,m)], axis = 1).sum()

其中n是列数要组合在一起,m是被分组列的总数。之后你必须重命名列。