#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. Это здорово! Приветствия!