pandas — генерирует фрейм данных, состоящий из сводок подмножеств фрейма данных

#python #pandas #dataframe #subset

#python #pandas #фрейм данных #подмножество

Вопрос:

У меня есть фрейм данных pandas df формы (100, 10) (100 строк, 10 столбцов), и я хочу сгенерировать df_summary фрейм данных из df этого:

  • имеет форму (1, 4) с именами столбцов [‘col1’, ‘col2’, ‘col3’, ‘col4’]
  • 1-я строка содержит mean s из 1 df -го столбца, 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