Сначала для создания DataFrame
используйте read_csv
с параметром header=[0,1]
, потому что csv имеет 2 заголовка строки для DataFrame
с MultiIndex
в столбцах:
import pandas as pd
temp=u"""week,12,exp,exp,exp
Subject,Group,1,2,3
255,HD,0,117.4,104.8,87.0
418,WT,0,61.2,56.1,97.9
300,HD,0,111.7,126.9,118.4
299,HD,0,50.7,37.8,30.6
258,WT,0,56.0,67.9,58.5
173,HD,0,76.2,131.7,119.5"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), header=[0,1])
print (df)
week 12 exp
Subject Group 1 2 3
255 HD 0 117.4 104.8 87.0
418 WT 0 61.2 56.1 97.9
300 HD 0 111.7 126.9 118.4
299 HD 0 50.7 37.8 30.6
258 WT 0 56.0 67.9 58.5
173 HD 0 76.2 131.7 119.5
Затем выберите последние 3 столбца для mean
:
df1 = df.iloc[:, -3:].mean(axis=1)
print (df1)
255 103.066667
418 71.733333
300 119.000000
299 39.700000
258 60.800000
173 109.133333
dtype: float64
А для нового столбца нужно присвоить кортежам определенные имена нового столбца MultiIndex:
df[('exp', 'mean')] = df.iloc[:, -3:].mean(axis=1)
print (df)
week 12 exp
Subject Group 1 2 3 mean
255 HD 0 117.4 104.8 87.0 103.066667
418 WT 0 61.2 56.1 97.9 71.733333
300 HD 0 111.7 126.9 118.4 119.000000
299 HD 0 50.7 37.8 30.6 39.700000
258 WT 0 56.0 67.9 58.5 60.800000
173 HD 0 76.2 131.7 119.5 109.133333
Но для упрощения можно сгладить столбцы:
df.columns = df.columns.map('_'.join)
print (df)
week_Subject 12_Group exp_1 exp_2 exp_3
255 HD 0 117.4 104.8 87.0
418 WT 0 61.2 56.1 97.9
300 HD 0 111.7 126.9 118.4
299 HD 0 50.7 37.8 30.6
258 WT 0 56.0 67.9 58.5
173 HD 0 76.2 131.7 119.5
df['exp_mean'] = df.iloc[:, -3:].mean(axis=1)
print (df)
week_Subject 12_Group exp_1 exp_2 exp_3 exp_mean
255 HD 0 117.4 104.8 87.0 103.066667
418 WT 0 61.2 56.1 97.9 71.733333
300 HD 0 111.7 126.9 118.4 119.000000
299 HD 0 50.7 37.8 30.6 39.700000
258 WT 0 56.0 67.9 58.5 60.800000
173 HD 0 76.2 131.7 119.5 109.133333