熊猫:对各种列执行操作并创建,重命名新列

时间:2018-09-19 09:47:37

标签: python pandas

我们有一个包含5列的数据框“ A”,我们想要添加每列的滚动平均值,我们可以这样做:

A = pd.DataFrame(np.random.randint(100, size=(5, 5)))

for i in range(0,5):
A[i+6] = A[i].rolling(3).mean()

但是,如果“ A”具有名为“ A”,“ B” ...“ E”的列:

A = pd.DataFrame(np.random.randint(100, size=(5, 5)), columns = ['A', 'B', 
'C', 'D', 'E'])

我们如何整齐地添加5个带有滚动平均值的列,并且每个名称分别为['A_mean','B_mean',....'E_mean']?

2 个答案:

答案 0 :(得分:3)

尝试一下:

for col in df:
     A[col+'_mean'] = A[col].rolling(3).mean()

以您的方式输出:

    0   1   2   3       4    6      7           8           9           10
0   16  53  9   16      67  NaN     NaN         NaN         NaN         NaN
1   55  37  93  92      21  NaN     NaN         NaN         NaN         NaN
2   10  5   93  99      27  27.0    31.666667   65.000000   69.000000   38.333333
3   94  32  81  91      34  53.0    24.666667   89.000000   94.000000   27.333333
4   37  46  20  18      10  47.0    27.666667   64.666667   69.333333   23.666667

并与我的输出:

    A   B   C   D        E   A_mean B_mean        C_mean     D_mean  E_mean
0   16  53  9   16      67   NaN        NaN         NaN         NaN         NaN
1   55  37  93  92      21   NaN        NaN         NaN         NaN         NaN
2   10  5   93  99      27   27.0   31.666667   65.000000   69.000000   38.333333
3   94  32  81  91      34   53.0   24.666667   89.000000   94.000000   27.333333
4   37  46  20  18      10   47.0   27.666667   64.666667   69.333333   23.666667

答案 1 :(得分:1)

无循环:

pd.concat([A, A.apply(lambda x:x.rolling(3).mean()).rename(
    columns={col: str(col) + '_mean' for col in A})], axis=1)


    A   B   C   D   E     A_mean     B_mean  C_mean     D_mean     E_mean
0  67  54  85  61  62        NaN        NaN     NaN        NaN        NaN
1  44  53  30  80  58        NaN        NaN     NaN        NaN        NaN
2  10  59  14  39  12  40.333333  55.333333    43.0  60.000000  44.000000
3  47  25  58  93  38  33.666667  45.666667    34.0  70.666667  36.000000
4  73  80  30  51  77  43.333333  54.666667    34.0  61.000000  42.333333