Как нарезать данные с помощью функции groupby()?

#python #pandas-groupby #slice #feature-extraction

#python #pandas-groupby #нарезать #функция-извлечение

Вопрос:

Я делаю проект ML. После предварительной обработки данных мне нужно выполнить извлечение объектов. В моем наборе данных у меня есть 25 классов (алфавиты в наборах данных), и для каждого класса есть 20 предметов (сколько раз я получал алфавит). С помощью функции groupby() все они (25 * 20 = 500) имеют одинаковый размер (1000). Я хочу сжать 1000 точек выборки до 50 точек выборки путем вычисления maccs среднего значения столбца.

Мой набор данных выглядит следующим образом:

Мой набор данных выглядит следующим образом

Это то, что я пробовал, но это не сработало. Это выдает ошибку ‘SeriesGroupBy’ объект не имеет атрибута ‘iloc’.

 for i in np.arange(211, 890, 20):
  new_dataset = new_dataset.groupby(['alphabet', 'subject'])['maccs'].iloc[i-10:i 20,6].mean(axis=0)
 

Как я могу получить доступ к строке и столбцам при использовании groupby() функции? Или что я могу использовать, чтобы сделать что-то подобное?

Ответ №1:

 import pandas as pd

alpha_df = pd.read_csv(##path to .csv file)

alpha_gb = alpha_df.groupby(['alphabet','subject'])
alpha_agg = alpha_gb.agg({
     'mccs' : 'mean'
})
agg_alpha_df = alpha_agg.reset_index()
 

Здесь я предполагаю, что вы хотите сначала классифицировать по alphabet , а затем классифицировать по subject столбцу. потому что порядок имен столбцов в таблице groupby() имеет значение.
Кстати, это можно сделать в одной строке

 grouped_df = alpha_df.groupby(['alphabet','subject'])['mccs'].reset_index(inplace=True)
 

Но первый более явный и настраиваемый.
вы можете посмотреть здесь дополнительные агрегированные операции.

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

1. Спасибо за ваш ответ, но я хочу сделать что-то другое. Как вы сказали, я объединил столбцы алфавита и темы. Затем я произвожу повторную выборку каждого из них, чтобы получить 1000 точек выборки. Теперь я пытаюсь изменить размер столбца maccs , чтобы изменить размер 1000 точек выборки на 50, но сначала мне нужно вычислить, что 50 строк столбцов maccs означают не все 1000 строк. У меня возникли проблемы с тем, как нарезать данные с помощью groupby() .

2. Извините, но я все еще не понял, что вы пытаетесь сделать. Если вы хотите groupby использовать только первые 50 строк; затем alpha_df.loc[:50, :].groupby(['alphabet','subject']) можно использовать

3. Спасибо, это сработало, но не совсем то, что я хотел. Я хочу взять в среднем каждые 50 из 1000 точек выборки, как я могу это сделать? for i in np.arange(211, 890, 20): new_ds = new_dataset.iloc[i-10:i 20].groupby(['alphabet', 'subject'])['maccs'].mean() . Я пробовал это, но это дает только одну строку.