Fed
Fed

Reputation: 93

Pandas: Perform operation on various columns and create, rename new columns

We have a dataframe 'A' with 5 columns, and we want to add the rolling mean of each column, we could do:

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

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

If however 'A' has column named 'A', 'B'...'E':

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

How could we neatly add 5 columns with the rolling mean, and each name being ['A_mean', 'B_mean', ....'E_mean']?

Upvotes: 1

Views: 60

Answers (2)

hellpanderr
hellpanderr

Reputation: 5896

Without loops:

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

Upvotes: 1

Frayal
Frayal

Reputation: 2161

try this:

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

Output with your way:

    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

and Output with mine:

    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

Upvotes: 3

Related Questions