У меня есть датафрейм, где я хочу увидеть нулевые значения.По сути, это дубликат этого вопроса: Pandas Groupby Как показать нулевые значения в кадре данных
Но, к сожалению, ответ не является дублирующим.Всякий раз, когда я пробую подход MultiIndex.from_product
, я получаю сообщение об ошибке:
ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.
, потому что у меня есть несколько уникальных значений для группировки.Однако я подтвердил, что тот же сценарий работает для гораздо меньших фреймов данных с меньшим количеством уникальных индексов (и, следовательно, с меньшим количеством элементов в df.index.levels[i].values
).
Вот идея о фрейме данных, с которым я работаю:
user1 user2 hour
-------------------
Alice Bob 0
Alice Carol 1
Alice Bob 13
Bob Eve 2
до
user1 user2 hour count
-------------------------------
Alice Bob 0 1
Alice Bob 1 0
Alice Bob 2 0
и так далее, но я получаю
user1 user2 hour count
-------------------------------
Alice Bob 0 1
Alice Bob 13 1
Alice Carol 1 1
Тем не менее, у меня ~ 1,2M уникальных комбинаций user1-user2
, поэтомуMultiIndex.from_product
не работает.
EDIT : вот код, который я использовал для некоторого фиктивного фрейма данных.Это работает для фиктивного случая, но не для более крупного случая:
import pandas as pd
df = pd.DataFrame({'id':[1,1,2,2,3,3],'hour':[0,1,0,0,1,1], 'to_count': [20,10,5,4,17,6]})
print(df)
agg_df = df.groupby(['id', 'hour']).agg({'to_count': 'count'})
print(df.groupby(['id', 'hour']).agg({'to_count':'count'}))
print(len(agg_df.index.levels))
levels = [agg_df.index.levels[i].values for i in range(len(agg_df.index.levels))]
levels[-1] = [0,1,2]
print(len(levels))
print(agg_df.index.names)
new_index = pd.MultiIndex.from_product(levels, names=agg_df.index.names)
# Reindex the agg_df and fill empty values with zero (NaN by default)
agg_df = agg_df.reindex(new_index, fill_value=0)
# Reset index
agg_df = agg_df.reset_index()
Есть ли лучший способ показать нулевые значения для groupby в больших фреймах данных панд?