У меня есть вопрос, который я считаю очень тривиальным, но я ищу лучший способ кодирования, чем то, что я считаю возможным.
У меня есть следующий фрейм данных:
Индекс 1 | Индекс 2 | Индекс 3 | Ценность |
---|---|---|---|
А | а1 | а11 | 1 |
А | а1 | а12 | 1 |
А | а2 | а21 | 1 |
Б | б1 | б11 | 1 |
С | с1 | с11 | 1 |
С | с2 | с21 | 1 |
Я хочу показать все результаты groupby и сгладить фрейм данных, чтобы он выглядел так:
Показатель | Ценность |
---|---|
А | 3 |
а1 | 2 |
а11 | 1 |
а12 | 1 |
Б | 1 |
б1 | 1 |
б11 | 1 |
С | 2 |
с1 | 1 |
с11 | 1 |
с2 | 1 |
с21 | 1 |
Я могу добиться этого, используя несколько групп в отдельном столбце Index X, а затем сопоставляя результаты в последовательном порядке, но я ищу более pythonic/эффективную операцию pandas, которая возможна, но я не знаю!
Спасибо!
Кажется, что вы можете просто сделать stack
и value_counts
:
index_cols = df.filter(like='Index ').columns
flattened_series = df[index_cols].stack().value_counts(sort=False)
Выход:
>>> flattened_series
A 3
a1 2
C 2
a11 1
a12 1
a2 1
a21 1
B 1
b1 1
b11 1
c1 1
c11 1
c2 1
c21 1
dtype: int64
Это просто подсчитывает значения столбцов индекса; на самом деле он не суммирует значения столбца Value
. Выполнение тот также было бы довольно простым:
flattened_summed_series = df.set_index('Value').stack().reset_index(level=0).groupby(0, sort=False)['Value'].sum().rename_axis(None)
Выход:
>>> flattened_summed_series
A 3
a1 2
a11 1
a12 1
a2 1
a21 1
B 1
b1 1
b11 1
C 2
c1 1
c11 1
c2 1
c21 1
Name: Value, dtype: int64