У меня есть следующая операция:
output = (df_pointer
.add(df1_pointer.dropna(how='all').sum(axis=1)
.groupby(level=0).sum()
.rename(str(trigger)).to_frame(), fill_value=0))
df_pointer
- это большой контейнер, который изначально заполнен нулями, но становится все более и более плотным.
df1_pointer
is многоиндексный фрейм данных (с двумя уровнями), очень разреженный, полный nan
и нулей.
Мне нужно суммировать по столбцам, а затем по индексу уровня 1 (так называемому «слою»).
Есть несколько особенностей, которые я знаю.
Для каждого ключа индекса уровня 0 («Сущность») у меня есть ровно восемь наблюдений в индексе «Слой»:
Column 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Entity Layer
1 1 1 NaN 0.0 0.0 NaN NaN 0.0 0.0 NaN NaN NaN 0.0 NaN 0.0 0.0 72.0
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.0
3 NaN 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN 0.0 NaN NaN 0.0 NaN NaN NaN NaN NaN NaN 0.0 NaN 19.5
5 NaN NaN NaN NaN 1.32435 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
....
I пробовал:
output = (df_pointer
.add(df1_pointer.dropna(how='all').sum(axis=1)
.groupby('Entity').sum()
.rename(str(trigger)).to_frame(), fill_value=0))
6.8 ms ± 829 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)
output2 = (df_pointer
.add(df1_pointer.dropna(how='all').sum(axis=1)
.groupby(level=0).sum()
.rename(str(trigger)).to_frame(), fill_value=0))
7.71 ms ± 518 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)
output2 = (df_pointer
.add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
.groupby('Entity').sum()
.rename(str(trigger)).to_frame(), fill_value=0))
7.96 ms ± 429 µs per loop (mean ± standard deviation of 20 runs, 100 loops each)
output3 = (df_pointer
.add(df1_pointer[df1_pointer!=0].dropna(how='all').sum(axis=1)
.unstack('Layer').sum(axis=1)
.rename(str(trigger)).to_frame(), fill_value=0))
9.26 ms ± 2.54 ms per loop (mean ± std. dev. of 20 runs, 10 loops each)
trigger
- это просто имя столбца для конкретной итерации. Иногда это список чисел, иногда это просто число. В этом примере это происходит из следующего списка имен столбцов: trigger_list=list(range(1,16))