使用 Pandas 计算分组列的逐行累积平均值

Qui*_*ten 5 python dataframe pandas

我想创建多列,显示分组列的逐行累积平均值。这是一些示例数据:

import pandas as pd

data = [[1, 4, 6, 10, 15, 40, 90, 100], [2, 5, 3, 11, 25, 50, 90, 120], [3, 7, 9, 14, 35, 55, 100, 120]]
df = pd.DataFrame(data, columns=['a1', 'a2', 'a3', 'a4', 'b1', 'b2', 'b3', 'b4'])

   a1  a2  a3  a4  b1  b2   b3   b4
0   1   4   6  10  15  40   90  100
1   2   5   3  11  25  50   90  120
2   3   7   9  14  35  55  100  120
Run Code Online (Sandbox Code Playgroud)

我想要的是生成这样的新列:

  • 新列是通过列和行a1_2的平均值计算的。a1a2
  • 新列由 columns和row-wise的a1_3平均值计算。a1a2a3
  • 新列由 列、和行方向a1_4的平均值计算。a1a2a3a4

对于带有 的分组列也应该发生同样的情况b。当然,您可以手动执行此操作,但当变量太多时,这并不理想。这是预期的输出:

df['a1_2'] = df[['a1', 'a2']].mean(axis=1)
df['a1_3'] = df[['a1', 'a2', 'a3']].mean(axis=1)
df['a1_4'] = df[['a1', 'a2', 'a3', 'a4']].mean(axis=1)
df['b1_2'] = df[['b1', 'b2']].mean(axis=1)
df['b1_3'] = df[['b1', 'b2', 'b3']].mean(axis=1)
df['b1_4'] = df[['b1', 'b2', 'b3', 'b4']].mean(axis=1)

   a1  a2  a3  a4  b1  b2   b3   b4  a1_2      a1_3  a1_4  b1_2       b1_3   b1_4
0   1   4   6  10  15  40   90  100   2.5  3.666667  5.25  27.5  48.333333  61.25 
1   2   5   3  11  25  50   90  120   3.5  3.333333  5.25  37.5  55.000000  71.25 
2   3   7   9  14  35  55  100  120   5.0  6.333333  8.25  45.0  63.333333  77.50  
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有某种自动方法可以做到这一点?

Shu*_*rma 3

expanding.mean

for c in ('a', 'b'):
    m = df.filter(like=c).expanding(axis=1).mean().iloc[:, 1:]
    df[m.columns.str.replace(r'(\d+)$', r'1_\1', regex=True)] = m
Run Code Online (Sandbox Code Playgroud)

结果

   a1  a2  a3  a4  b1  b2   b3   b4  a1_2      a1_3  a1_4  b1_2       b1_3   b1_4
0   1   4   6  10  15  40   90  100   2.5  3.666667  5.25  27.5  48.333333  61.25
1   2   5   3  11  25  50   90  120   3.5  3.333333  5.25  37.5  55.000000  71.25
2   3   7   9  14  35  55  100  120   5.0  6.333333  8.25  45.0  63.333333  77.50
Run Code Online (Sandbox Code Playgroud)

另外一个选择:

for c in ('a', 'b'):
    m = df.filter(like=c).expanding(axis=1).mean().iloc[:, 1:]
    df[m.columns.str.replace(r'(\d+)$', r'1_\1', regex=True)] = m
Run Code Online (Sandbox Code Playgroud)