Я пытаюсь реализовать алгоритм исключения переменных, используя Pandas. Если кто-либо знаком с шагом суммирования, приведите таблицу, в которой a, b, c являются переменными (необязательно булевозначными), а f - это некоторая функция (коэффициент), заданная значениями этих переменных.
a b c f
0 True True True 0.015
1 True True False 0.035
2 True False True 0.270
3 True False False 0.180
4 False True True 0.030
5 False True False 0.070
6 False False True 0.240
7 False False False 0.160
Я хочу суммировать f
с всех строк, где (a,c)=(T,T)
, а также f
с всех строк, где (a,c)=(T,F)
, (F,T)
, (F,F)
. Результат выглядит как
a c f
0 True True 0.285
1 True False 0.215
2 False True 0.27
3 False False 0.23
Отсюда и название "sum-out (b
)".
Самое близкое, что я могу получить, это использовать pd.pivot_table(df, index=df.index.values, columns=['a', 'c'], values='f', aggfunc=np.sum, fill_value=0).sum()
, который возвращает
a c
False False xxx
True xxx
True False xxx
True xxx
Другой unstack
может дать нам
c False True
a
False xxx xxx
True xxx xxx
, что все еще не то, что я хочу.
Обратите внимание, что у меня может быть произвольно много переменных и произвольно много переменных для суммирования (или сохранения). Поэтому, хотя в этом случае я могу сделать pd.pivot_table(df, index=<some of the var left, e.g. a>, columns=<other var left, e.g. c>, values='f', aggfunc=np.sum)
, чтобы получить тот же результат, в других случаях может остаться только одна переменная или слишком много.
Переменные могут не иметь логического типа, но они должны иметь конечные и дискретные домены.
Также обратите внимание, что мой индекс здесь - всего лишь фиктивный бессмысленный индекс. Под «сохранением исходного индекса» я подразумеваю просто оставить их фиктивными, но каким-то образом агрегировать только по axis=0
.
Кроме того, это также нормально, если кто-либо может предложить лучшую многомерную матрицу, такую как структура данных, для сделай работу.