熊猫在列的规则间隔上取平均值

emi*_*laz 1 python pandas

给定一个像这样的熊猫数据框:

    Col_1 Col_2 Col_3 Col_4 Col_5 Col_6
0     1     2     3     4     5     6
1     7     8     9     10    11    12
Run Code Online (Sandbox Code Playgroud)

我想取由某个给定间隔定义的列子集的平均值。假设间隔是两个,那么我想取 Col_1 和 Col_2、Col_3 和 Col 4 以及 Col_5 和 Col6 的平均值。或者给定间隔为 3,我希望输出为

    First_Avg  Second_Avg
0      2          5
1      8          11
Run Code Online (Sandbox Code Playgroud)

假设我不能放弃我的列的命名。代码:

 import pandas as pd
 df = pd.DataFrame(columns =['Col_'+str(n) for n in range(1,7)], data =np.arange(12).reshape(2,6))
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

想法是np.arange按列的长度创建,然后对组使用整数除法,将其传递给groupbywithaxis=1和聚合mean

N = 2
df1 = df.groupby(np.arange(len(df.columns)) // N, axis=1).mean().add_prefix('Avg_')
print (df1)
   Avg_0  Avg_1  Avg_2
0    1.5    3.5    5.5
1    7.5    9.5   11.5

N = 3
df1 = df.groupby(np.arange(len(df.columns)) // N, axis=1).mean().add_prefix('Avg_')
print (df1)
   Avg_0  Avg_1
0      2      5
1      8     11
Run Code Online (Sandbox Code Playgroud)

详情

print (np.arange(len(df.columns)) // 2)
[0 0 1 1 2 2]

print (np.arange(len(df.columns)) // 3)
[0 0 0 1 1 1]
Run Code Online (Sandbox Code Playgroud)

编辑:如果输出中只有几列可能通过新列名创建字典,然后使用rename

d = {0:'bar', 1:'baz', 2:'foo'}
N = 2
df1 = df.groupby(np.arange(len(df.columns)) // N, axis=1).mean().rename(columns=d)
print (df1)
   bar  baz   foo
0  1.5  3.5   5.5
1  7.5  9.5  11.5
Run Code Online (Sandbox Code Playgroud)

对于按大写字母生成列名的更通用的解决方案,请使用:

import string
d = dict(enumerate(string.ascii_uppercase))

N = 2
df1 = df.groupby(np.arange(len(df.columns)) // N, axis=1).mean().rename(columns=d)
print (df1)
     A    B     C
0  1.5  3.5   5.5
1  7.5  9.5  11.5
Run Code Online (Sandbox Code Playgroud)