【问题标题】:Pandas take average over regular intervals of columnsPandas 在列的固定间隔上取平均值
【发布时间】:2020-05-15 02:33:00
【问题描述】:

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

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

【问题讨论】:

  • 您的问题是什么?你真的尝试过什么,做过什么研究吗?
  • @AMC 这个问题已经回答了,而且问题已经很清楚了。

标签: python pandas


【解决方案1】:

想法是通过列的长度创建np.arange,然后对组使用整数除法,将其传递给groupbyaxis=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

详情

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

【讨论】:

  • 你是熊猫建议的忍者 :D 再次感谢你。
  • 您是否知道我将如何为新列提供预先指定的名称?
  • @emilaz - 你需要First,第二个吗?
【解决方案2】:

我会从numpysplit

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

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多