pandas - генерировать фрейм данных, состоящий из резюме подмножеств фрейма данных

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

  • имеет форму (1, 4) с именами столбцов ['col1', 'col2', 'col3', 'col4']
  • 1-я строка содержит mean из 1-го столбца df, 2-4-го столбца (среднее значение всех строк в этих 3 столбцах), 5-8-й столбец и 9-10-й столбец
  • 2-я строка содержит variance из 1-го столбца df, 2-4-го столбца, 5-8-го столбца и 9-10-го столбца

Я провел свое исследование и до сих пор не знаю, как сделать это эффективно. Любая помощь будет оценена по достоинству.


person Teddy C    schedule 04.12.2020    source источник


Ответы (1)


Вот два решения, первое с указанными диапазонами в списке, изменение формы на stack и агрегирование на _ 2_ с переходом к _ 3_:

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, unpivot с помощью 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
person jezrael    schedule 04.12.2020