Pandas DataFrame, как группировать (сводить?) Строки по значениям указанных столбцов, но сохраняя исходный индекс? - PullRequest
3 голосов
/ 06 марта 2020

Я пытаюсь реализовать алгоритм исключения переменных, используя 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.

Кроме того, это также нормально, если кто-либо может предложить лучшую многомерную матрицу, такую ​​как структура данных, для сделай работу.

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Вы можете использовать групповые и групповые функции, подобные этой.

df.groupby(['a','c'])['f'].agg('sum').reset_index()
1 голос
/ 06 марта 2020

Поскольку вас не волнует column 'b', вы можете сбросить его, а затем сгруппировать по столбцам 'a' and 'c' следующим образом:

df1 = df[['a', 'c','f']]
df1 = df1.groupby(['a', 'c']).sum().reset_index()

Это должно вернуть искомый ответ. Не забудьте сбросить индекс результирующего кадра данных.

...