pandas иерархия через запятую - PullRequest
1 голос
/ 24 апреля 2020

У меня есть следующий формат данных иерархических данных. Может быть несколько строк одного уровня и переменной глубины. Я пытаюсь получить результат, в котором в col_2 мы видим агрегированную сумму всех нижних уровней экземпляра.

Использование простого группового режима не работает, поскольку оно не понимает иерархическую структуру. Я попытался разбить col_1 на несколько столбцов с уровнями от 1 до 6 (глубина), и, следовательно, сгруппировать уровни от 1 до 6, но результаты по-прежнему неверны, несмотря на то, что фрейм данных является многоиндексным.

код перед разделением: df.groupby(["col_1"], as_index=False).sum()

код после разделения: df.groupby(["level-1","level-2","level-3","level-4","level-5","level-6"], as_index=False).sum()

Буду признателен за любую помощь!

ОБНОВЛЕНИЕ благодаря @Yo_Chris:

import pandas as pd
# sample data
df = pd.DataFrame({'Col1': ['PUU', 'PUU;UT', 'PUU;UT', 'PUU;UT;AHU', 'PUU;UT;AHU;CSP', 'PUU;AS', 'PUU;PREV', 'PUU;TECHNOLOGY', 'PUU;TECHNOLOGY', 'PUU;TECHNOLOGY;SPEC'],
                  'Col2': [1000,1000,50,500,250,100,1000,300,500,900]})

# groupby, sum and invert 
s = df.groupby('Col1')['Col2'].sum()[::-1]
# groupby, cumsum and invert
s.groupby(s.index.str[0]).cumsum()[::-1])```

# this results in the following:

Col1
PUU                    5600
PUU;AS                 4600
PUU;PREV               4500
PUU;TECHNOLOGY         3500
PUU;TECHNOLOGY;SPEC    2700
PUU;UT                 1800
PUU;UT;AHU              750
PUU;UT;AHU;CSP          250
Name: Col2, dtype: int64

В то время как мы хотим:

PUU                    5600
PUU;AS                  100
PUU;PREV               1000
PUU;TECHNOLOGY         1700
PUU;TECHNOLOGY;SPEC     900
PUU;UT                 1800
PUU;UT;AHU              750
PUU;UT;AHU;CSP          250

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Я сделал некоторые предположения на основе ваших данных выборки. Этот col1 всегда представляет собой один символ, разделенный точкой с запятой, и этот col1 всегда сортируется: col1 не может быть ['a;b;c', 'a', 'a;b'...]

# sample data
df = pd.DataFrame({'Col1': ['a', 'a;b', 'a;b', 'a;b;c', 'a;b;c;d', 'e', 'f', 'g', 'g', 'g;h'],
                  'Col2': [1000,1000,50,500,250,100,1000,300,500,900]})

# groupby, sum and invert 
s = df.groupby('Col1')['Col2'].sum()[::-1]
# groupby, cumsum and invert
s.groupby(s.index.str[0]).cumsum()[::-1]

# return a pd.Series

Col1
a          2800
a;b        1800
a;b;c       750
a;b;c;d     250
e           100
f          1000
g          1700
g;h         900
Name: Col2, dtype: int64
0 голосов
/ 29 апреля 2020

В конечном итоге это удалось решить, разделив col_1 на отдельные столбцы по глубине. затем группируйте по каждому столбцу (глубина 1, 2, .. 6) и объединяйте все результирующие кадры данных. Не очень чисто, но работает правильно!

...