numpy.vstack как агрегатор в группе панд - PullRequest
1 голос
/ 09 мая 2019

У меня есть датафрейм для панд:

d = {'group' : [1, 1, 2, 2], 'histogram' : [[1,2,3], [4,5,6], [7,8,9],[10,11,12]]}
df = pd.DataFrame(d)

enter image description here

Фрейм данных содержит результаты анализа гистограммы. Цель состоит в том, чтобы создать двумерные массивы для каждой группы. т.е.

для группы 1, двумерный массив numpy будет np.array([[1,2,3],[4,5,6]]). Форма будет (3,2)

Я попробовал следующее:

df_test = pd.DataFrame(df.groupby("group").agg({'histogram':'count',
                                             'histogram':lambda x: np.vstack(x)}))

однако я получаю следующую ошибку:

Исключение: должен производить агрегированную стоимость

Конечно, я мог бы перебрать данные, отфильтровать по группам и использовать

np.vstack(df_filtered["histogram"])

но я думаю, должен быть более дружелюбный способ для панд. В конце концов я буду анализировать 2D-массивы в модель Keras.

1 Ответ

1 голос
/ 09 мая 2019

Закрыть, что вам нужно, это преобразовать его в список:

df_test = (pd.DataFrame(df.groupby("group")['histogram']
             .agg([('c', 'count'),('2d',lambda x: np.vstack(x).tolist())])))
print (df_test)
       c                         2d
group                              
1      2     [[1, 2, 3], [4, 5, 6]]
2      2  [[7, 8, 9], [10, 11, 12]]

Или используйте GroupBy.apply:

f = lambda x: pd.DataFrame([[len(x), np.vstack(x)]], columns=['c','2d'])
df_test = df.groupby("group")['histogram'].apply(f).reset_index(level=1, drop=True)
print (df_test)
       c                         2d
group                              
1      2     [[1, 2, 3], [4, 5, 6]]
2      2  [[7, 8, 9], [10, 11, 12]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...