熊猫:每N列的总和

时间:2017-10-06 13:35:06

标签: python pandas

我有数据框

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

我该如何解决?

3 个答案:

答案 0 :(得分:5)

所有没有日期的列中的set_index

df = df.set_index('ID')

1。 groupbysplit列编辑并首先选择:

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()

3。将列转换为日期时间和groupby年:

df.columns = pd.to_datetime(df.columns)
df = df.groupby(df.columns.year, axis=1).sum()
{p> 4. {/ strong> 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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

上面的代码有一个轻微的语法错误,并引发以下错误:

ValueError:对象类型没有轴命名为

基本上,groupby条件需要用[]包装。因此,为了方便起见,我正确地重写了代码:

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

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