#python #pandas #dataframe #subset
#python #pandas #фрейм данных #подмножество
Вопрос:
У меня есть фрейм данных pandas df
формы (100, 10)
(100 строк, 10 столбцов), и я хочу сгенерировать df_summary
фрейм данных из df
этого:
- имеет форму
(1, 4)
с именами столбцов [‘col1’, ‘col2’, ‘col3’, ‘col4’] - 1-я строка содержит
mean
s из 1df
-го столбца, 2-4-го столбцов (среднее значение всех строк в этих 3 столбцах), 5-8-го и 9-10-го столбцов - 2-я строка содержит
variance
s изdf
1-го столбца, 2-4-го столбцов, 5-8-го столбцов и 9-10-го столбцов
Я провел свое исследование и до сих пор не знаю, как это сделать эффективно. Любая помощь будет оценена.
Ответ №1:
Вот 2 решения: сначала с указанными диапазонами в списке, изменить по stack
и объединить Series.agg
с помощью pass to concat
:
np.random.seed(2020)
df = pd.DataFrame(np.random.randint(10, size=(100, 10)))
L = [[0], range(2, 4), range(5, 8), range(8, 10)]
cols = ['col1', 'col2', 'col3', 'col4']
out = pd.concat([df[x].stack().agg(['mean','var']) for x in L], axis=1, keys=cols)
print (out)
col1 col2 col3 col4
mean 4.120000 4.270000 4.580000 4.405000
var 8.793535 8.298593 7.963478 9.418065
Или для диапазонов используется cut
, отключите, DataFrame.melt
а затем объедините mean
с var
:
cols = ['col1', 'col2', 'col3', 'col4']
df.columns = pd.cut(df.columns, [0,1,5,8,11], labels=cols, include_lowest=True, right=False)
df = df.melt().groupby('variable')['value'].agg(['mean','var']).T
print (df)
variable col1 col2 col3 col4
mean 4.120000 4.482500 4.580000 4.405000
var 8.793535 8.611222 7.963478 9.418065