Есть ли более краткий способ получения среднего значения нескольких переменных на основе конкретной подстроки из строки

#python #pandas #for-loop

#python #pandas #для цикла

Вопрос:

У меня есть переменные, связанные с именем, которое я хочу получить средним значением на основе его основного имени. Отмечая, что у меня более двух основных имен в отличие от примера ниже, и было бы неаккуратно выполнять все это. Итак, мне было интересно, может ли кто-нибудь сделать это более кратким? Заранее спасибо!

 fullname = ['MainName1,subname1','MainName1,subname2','MainName2,subname1','MainName2,subname2']
var1 = [1,5,9,4]
var2 = [2,6,1,5]
var3 = [3,7,2,6]
var4 = [4,8,3,7]

    vars = pd.DataFrame(np.column_stack([fullname,var1,var2,var3,var4]))
    vars = vars.set_index('fullname')

    meanvars = [(allvars[allvars.index.str.contains('MainName1')]).mean(),
                (allvars[allvars.index.str.contains('MainName2')]).mean()]
    MainName = ['MainName1','MainName2']

    Final = pd.DataFrame(np.column_stack([MainName,meanvars]))
  

Комментарии:

1. Можете ли вы привести пример того, как выглядит ваш фрейм данных? Может ли это быть так просто, как allvars.groupby('names').mean() ?

2. извините, не понял, что мой вопрос был настолько запутанным. Отредактировал это, спасибо!

3. @WarenDaleSoriano — как работает мое решение?

Ответ №1:

Вы можете использовать str.extract для получения подстрок с объединенными подстроками из списка, объединенного | для регулярного выражения, OR переданного groupby с агрегированием mean :

 fullname = ['MainName1,subname1','MainName1,subname2',
            'MainName2,subname1','MainName2,subname2']
var1 = [1,5,9,4]
var2 = [2,6,1,5]
var3 = [3,7,2,6]
var4 = [4,8,3,7]

df = pd.DataFrame(np.column_stack([var1,var2,var3,var4]), index=fullname)
print (df)
                    0  1  2  3
MainName1,subname1  1  2  3  4
MainName1,subname2  5  6  7  8
MainName2,subname1  9  1  2  3
MainName2,subname2  4  5  6  7

L = ['MainName1','MainName2']
idx = df.index.str.extract('('  '|'.join(L)   ')', expand=False)
print (idx)
Index(['MainName1', 'MainName1', 'MainName2', 'MainName2'], dtype='object')

df = df.groupby(idx).mean()
print (df)
             0    1    2    3
MainName1  3.0  4.0  5.0  6.0
MainName2  6.5  3.0  4.0  5.0
  

Комментарии:

1. Это здорово! Приветствия!