У меня есть фрейм данных с пятью столбцами: G1, G2, G3, G4 и Tax. Я группирую по G и налогу для каждого столбца G, чтобы подсчитать, сколько строк имеет значение 1. Но размерность результата различна для каждого G, потому что некоторые G имеют только 0 значений.
Это мой код:
self.instance.df.groupby(["G1", "Tax"]).size().drop(0)
self.instance.df.groupby(["G2", "Tax"]).size().drop(0)
Я удаляю индекс 0, потому что мне нужно только 1 значение.
НАЧАЛЬНЫЙ РАМКА ДАННЫХ:
G1 G2 G3 G4 Tax
0 0 1 0 0 1.1
1 1 1 0 1 1.1
2 1 1 0 0 1.2
3 0 1 0 1 1.3
Результат, который я ожидаю:
G1 Tax
1 1.1 5
1.2 7
1.5 3
1.7 0
и результат, который я получаю:
G1 Tax
1 1.1 5
1.2 7
1.5 3
Я включил в вопрос исходный datafreme, но он решен. Спасибо за ответы.






IIUC, вы можете значительно упростить свою логику, выполнив всего одну groupby:
out = (df.set_index('Tax').filter(like='G').eq(1)
.groupby(level='Tax').sum()
)
Или:
cols = ['G1', 'G2', 'G3', 'G4']
out = df.groupby('Tax')[cols].agg(lambda x: x.eq(1).sum())
И если ваши значения только 0/1:
cols = ['G1', 'G2', 'G3', 'G4']
out = df.groupby('Tax')[cols].sum()
Пример:
# input
G1 G2 G3 G4 Tax
0 0 1 0 0 A
1 1 1 0 1 A
2 1 1 0 0 A
3 0 1 0 1 B
# output
G1 G2 G3 G4
Tax
A 2 3 0 1
B 0 1 0 1
Можете ли вы поделиться исходным фреймом данных?