У меня есть такой фрейм данных:
day time category count
1 1 a 13
1 2 a 47
1 3 a 1
1 5 a 2
1 6 a 4
2 7 a 14
2 2 a 10
2 1 a 9
2 4 a 2
2 6 a 1
Я хочу сгруппировать по дням и категориям и получить вектор подсчетов за раз. Где время может быть от 1 до 10. Максимальное и минимальное время, которое я определил в двух переменных, называемых max и min.
Вот как я хочу, чтобы итоговый фрейм данных выглядел:
day category count
1 a [13,47,1,0,2,4,0,0,0,0]
2 a [9,10,0,2,0,1,14,0,0,0]
Кто-нибудь знает, как эту агрегацию сделать ваектором?
Используйте reindex
с MultiIndex.from_product
для добавления недостающих категорий, а затем groupby
с list
:
df = df.set_index(['day','time', 'category'])
a = df.index.levels[0]
b = range(1,11)
c = df.index.levels[2]
df = df.reindex(pd.MultiIndex.from_product([a,b,c], names=df.index.names), fill_value=0)
df = df.groupby(['day','category'])['count'].apply(list).reset_index()
print (df)
day category count
0 1 a [13, 47, 1, 0, 2, 4, 0, 0, 0, 0]
1 2 a [9, 10, 0, 2, 0, 1, 14, 0, 0, 0]
Обновлено:
df = (df.set_index(['day','time', 'category'])['count']
.unstack(1, fill_value=0)
.reindex(columns=range(1,11), fill_value=0))
print (df)
time 1 2 3 4 5 6 7 8 9 10
day category
1 a 13 47 1 0 2 4 0 0 0 0
2 a 9 10 0 2 0 1 14 0 0 0
df = df.apply(list, 1).reset_index(name='count')
print (df)
day ... count
0 1 ... [13, 47, 1, 0, 2, 4, 0, 0, 0, 0]
1 2 ... [9, 10, 0, 2, 0, 1, 14, 0, 0, 0]
[2 rows x 3 columns]
@dagrun - Проблема с MultiIndex
или столбцом count
, заполненным list
? Поскольку pandas работают со списками, наборами, dicts, кортежами вместо скаляров, таких как int, строки в значениях не так эффективны, и если большие данные должны быть проблемой.
Проблема с памятью возникает в этой строке: «df = df.reindex (pd.MultiIndex.from_product ([a, b, c], names = df.index.names), fill_value = 0)»
@dagrun - на мой взгляд, проблема с reindex
. Попробуйте протестировать mux = pd.MultiIndex.from_product([a,b,c]
, а затем df = df.reindex(mux, names=df.index.names), fill_value=0)
Я сделал .. Мой код никогда не доходил до шага переиндексации, он исчерпывает память на "mux = pd.MultiIndex.from_product ([a, b, c], names = df.index.names)"
Не уверен, что это поможет, а как насчет unstack
? Но если вы работаете с большими данными, лучше добавить RAM
или использовать другую библиотеку, например dask
, blaze
.
@dagrun - тогда есть несколько столбцов, просто удалите его.
Unstack помог. Спасибо! : D
Это решение работает! Однако у меня проблема с Multidex, использующим так много памяти, что у меня заканчивается. Вы знаете какой-нибудь хороший способ исправить это?