给一只熊猫这样的数据:
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
我想取列子集上的平均值,由给定的间隔来定义。假设间隔是2,那么我想取Col_1和Col_2,Col_3和Col 4以及Col_5和Col6的平均值。如果间隔为3,我希望输出为
First_Avg Second_Avg
0 2 5
1 8 11
可以假定,我不能放弃对列的命名。代码:
import pandas as pd
df = pd.DataFrame(columns =['Col_'+str(n) for n in range(1,7)], data =np.arange(12).reshape(2,6))
发布于 2020-01-29 14:53:47
Idea是根据列的长度创建np.arange
,然后对组使用整数除法,将其与axis=1
和聚合mean
传递给groupby
。
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
详细信息
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]
编辑:如果输出中只有少数列是可能的,则可以通过新列名创建字典,然后使用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
对于使用大写字母生成的列名的更通用解决方案,请使用:
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
发布于 2020-01-29 14:58:33
我要做split
从numpy
pd.concat([x.mean(1)for x in np.split(df, [3], axis=1)],1)
0 1
0 2.0 5.0
1 8.0 11.0
https://stackoverflow.com/questions/59969720
复制相似问题