Создание новых средних значений для мультипликатных файлов с использованием l oop с использованием python - PullRequest
1 голос
/ 28 марта 2020

У меня есть этот фрейм данных, который выглядит следующим образом:

df = pd.DataFrame({'A':[230,345,222],'':[235,375,292],'B':[210,385,260],' ':[235,378,292],'C':[255,379,333],'D':[555,321,121],'E':[999,123,333],'  ':[1231,1231,222]})
     A               B               C       D       E  
0   230     235     210     235     255     555     999     1231
1   345     375     385     378     379     321     123     1231
2   222     292     260     292     333     121     333     222  

Я хочу сделать средние значения столбцов для каждого параметра, потому что такие параметры, как A, B и E имеют 2 столбца, в которых есть значения. До сих пор я мог сделать только 1 столбец параметров и потерян, когда я хочу создать параметр для других столбцов. Код ниже

dflist=pd.DataFrame()
for i, file in enumerate(flist):
    df = pd.read_csv(file, skiprows = [0,1,3,4])
    data = df.iloc[:,1:2]
    dflist['A%i'%i] = data.mean(axis=1)   

Я хочу, чтобы результат был примерно таким:

     A              Aavg     B              Bavg     C       D        E            Eavg
0   230     235     123     210     235     123     255     555     999     1231    111
1   345     375     456     385     378     324     379     321     123     1231    222
2   222     292     333     260     292     1231    333     121     333     222     333

Любая помощь будет оценена

Редактировать: Мои CSV-файлы выглядят как это enter image description here

1 Ответ

0 голосов
/ 28 марта 2020

Вы неправильно индексируете свои столбцы. Правильная индексация будет выглядеть примерно так:

df = pd.DataFrame({
    ('A', 1):[230,345,222],
    ('A', 2):[235,375,292],
    ('B', 1):[210,385,260],
    ('B', 2):[235,378,292],
    ('C', 1):[255,379,333],
    ('D', 1):[555,321,121],
    ('E', 1):[999,123,333],
    ('E', 2):[1231,1231,222]
})

    A         B         C    D    E      
    1    2    1    2    1    1    1     2
0  230  235  210  235  255  555  999  1231
1  345  375  385  378  379  321  123  1231
2  222  292  260  292  333  121  333   222

Тогда вы можете очень легко усреднить по столбцам:

df.mean(level=0, axis=1)

       A      B      C      D       E
0  232.5  222.5  255.0  555.0  1115.0
1  360.0  381.5  379.0  321.0   677.0
2  257.0  276.0  333.0  121.0   277.5

Если у вас нет контроля над форматом данных, вы можете обрабатывать каждый столбец с пустым именем как продолжение предыдущего столбца:

col_group = df.columns.to_series() \
                .str.strip() \
                .replace('')

df.groupby(col_group, axis=1).mean()

Функция replace выглядит обманчиво простой, но на самом деле она делает две вещи одновременно: (1) заменяет пустые имена столбцов на None; (2) заполните эти None s последним ненулевым именем столбца (через method='pad' параметр по умолчанию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...