Так что я не на 100% уверен в том, как выглядит ваш ввод или что вы хотите вернуть, но если я правильно понимаю, я думаю, что сработает следующее.
ИЗД.
EDIT2 : добавлены звездочки (*
), чтобы указать, какие строки отбрасываются.
EDIT3 : изменена функция из-за назначения путии копии работают с pandas.DataFrame
Функция для выполнения процесса:
def drop_small(dfcop, cutoff_multiplier):
# Create copy of dataframe so we don't alter the original
df=dfcop.copy(deep=True)
# Group on all columns except 'Value' and 'Unit'
grp_cols = [i for i in df.columns if i not in ['Value', 'Unit']]
groupers = [grp_cols[:i+1] for i in range(len(grp_cols))]
print(groupers)
#loop through all hierarchical groupings
for grp in groupers:
print(f"Grouping on {grp}")
# Add a column with the group sums to the dataframe
df['gsum'] = df.groupby(grp)['Value'].transform('sum')
# Compute the max of the parent group - don't do this if we are grouping by a single field
if len(grp) > 1:
df['gmax'] = df.groupby(grp[:-1])['gsum'].transform(lambda x: max(x)/cutoff_multiplier)
else:
df['gmax'] = df.gsum.max()/cutoff_multiplier
print("Grouped sums and cutoffs for this hierarchy:")
print(df)
# Drop all rows where the group sum is less than the cutoff mulitplier of the max
idexs = df[df.gsum < df.gmax].index
df = df[df.gsum >= df.gmax]
print('Indexes dropped:')
print(','.join([str(i) for i in idexs]))
# Remove the group sum column
df.drop(['gsum', 'gmax'], axis=1, inplace=True)
return df
Вот как это работает для примера таблицы.
name Continent Region Country State Value Unit
0 Myindicator 1 1 3 1 50 kg
1 Myindicator 1 1 3 4 50 kg
2 Myindicator 1 1 2 5 20 kg
3 Myindicator 1 1 2 5 50 kg
4 Myindicator 1 1 2 6 30 kg
5 Myindicator 1 1 1 7 50 kg
6 Myindicator 1 1 1 8 20 kg
7 Myindicator 1 2 4 9 50 kg
8 Myindicator 1 2 4 9 50 kg
9 Myindicator 1 2 4 10 40 kg
10 Myindicator 1 2 5 11 20 kg
11 Myindicator 1 2 5 3 40 kg
12 Myindicator 1 2 5 3 40 kg
13 Myindicator 1 2 6 2 10 kg
14 Myindicator 1 3 7 12 50 kg
15 Myindicator 1 3 7 12 50 kg
16 Myindicator 1 3 8 14 15 kg
17 Myindicator 1 3 8 14 15 kg
18 Myindicator 1 3 8 13 15 kg
19 Myindicator 1 3 8 13 1 kg
20 Myindicator 1 4 9 15 10 kg
21 Myindicator 1 4 9 16 10 kg
Группировка по ['name']
Сгруппированные суммы и обрезки для этой иерархии:
name Continent Region Country State Value Unit gsum gmax
0 Myindicator 1 1 3 1 50 kg 686 343
1 Myindicator 1 1 3 4 50 kg 686 343
2 Myindicator 1 1 2 5 20 kg 686 343
3 Myindicator 1 1 2 5 50 kg 686 343
4 Myindicator 1 1 2 6 30 kg 686 343
5 Myindicator 1 1 1 7 50 kg 686 343
6 Myindicator 1 1 1 8 20 kg 686 343
7 Myindicator 1 2 4 9 50 kg 686 343
8 Myindicator 1 2 4 9 50 kg 686 343
9 Myindicator 1 2 4 10 40 kg 686 343
10 Myindicator 1 2 5 11 20 kg 686 343
11 Myindicator 1 2 5 3 40 kg 686 343
12 Myindicator 1 2 5 3 40 kg 686 343
13 Myindicator 1 2 6 2 10 kg 686 343
14 Myindicator 1 3 7 12 50 kg 686 343
15 Myindicator 1 3 7 12 50 kg 686 343
16 Myindicator 1 3 8 14 15 kg 686 343
17 Myindicator 1 3 8 14 15 kg 686 343
18 Myindicator 1 3 8 13 15 kg 686 343
19 Myindicator 1 3 8 13 1 kg 686 343
20 Myindicator 1 4 9 15 10 kg 686 343
21 Myindicator 1 4 9 16 10 kg 686 343
Пропущено индексов: нет
Группировка по ['name', 'Continent']
Сгруппированные суммы и обрезки для этой иерархии:
name Continent Region Country State Value Unit gsum gmax
0 Myindicator 1 1 3 1 50 kg 686 343
1 Myindicator 1 1 3 4 50 kg 686 343
2 Myindicator 1 1 2 5 20 kg 686 343
3 Myindicator 1 1 2 5 50 kg 686 343
4 Myindicator 1 1 2 6 30 kg 686 343
5 Myindicator 1 1 1 7 50 kg 686 343
6 Myindicator 1 1 1 8 20 kg 686 343
7 Myindicator 1 2 4 9 50 kg 686 343
8 Myindicator 1 2 4 9 50 kg 686 343
9 Myindicator 1 2 4 10 40 kg 686 343
10 Myindicator 1 2 5 11 20 kg 686 343
11 Myindicator 1 2 5 3 40 kg 686 343
12 Myindicator 1 2 5 3 40 kg 686 343
13 Myindicator 1 2 6 2 10 kg 686 343
14 Myindicator 1 3 7 12 50 kg 686 343
15 Myindicator 1 3 7 12 50 kg 686 343
16 Myindicator 1 3 8 14 15 kg 686 343
17 Myindicator 1 3 8 14 15 kg 686 343
18 Myindicator 1 3 8 13 15 kg 686 343
19 Myindicator 1 3 8 13 1 kg 686 343
20 Myindicator 1 4 9 15 10 kg 686 343
21 Myindicator 1 4 9 16 10 kg 686 343
Индексы отброшены: нет
Группировка по ['name', 'Continent', 'Region']
Сгруппированные суммы и сокращения для этой иерархии:
name Continent Region Country State Value Unit gsum gmax
0 Myindicator 1 1 3 1 50 kg 270 135
1 Myindicator 1 1 3 4 50 kg 270 135
2 Myindicator 1 1 2 5 20 kg 270 135
3 Myindicator 1 1 2 5 50 kg 270 135
4 Myindicator 1 1 2 6 30 kg 270 135
5 Myindicator 1 1 1 7 50 kg 270 135
6 Myindicator 1 1 1 8 20 kg 270 135
7 Myindicator 1 2 4 9 50 kg 250 135
8 Myindicator 1 2 4 9 50 kg 250 135
9 Myindicator 1 2 4 10 40 kg 250 135
10 Myindicator 1 2 5 11 20 kg 250 135
11 Myindicator 1 2 5 3 40 kg 250 135
12 Myindicator 1 2 5 3 40 kg 250 135
13 Myindicator 1 2 6 2 10 kg 250 135
14 Myindicator 1 3 7 12 50 kg 146 135
15 Myindicator 1 3 7 12 50 kg 146 135
16 Myindicator 1 3 8 14 15 kg 146 135
17 Myindicator 1 3 8 14 15 kg 146 135
18 Myindicator 1 3 8 13 15 kg 146 135
19 Myindicator 1 3 8 13 1 kg 146 135
20 Myindicator 1 4 9 15 10 kg 20 135 *
21 Myindicator 1 4 9 16 10 kg 20 135 *
Индексы отброшены: 20,21
Группировка по ['name', 'Continent', 'Region', 'Country']
Сгруппированные суммы и сокращения для этой иерархии:
name Continent Region Country State Value Unit gsum gmax
0 Myindicator 1 1 3 1 50 kg 100 50
1 Myindicator 1 1 3 4 50 kg 100 50
2 Myindicator 1 1 2 5 20 kg 100 50
3 Myindicator 1 1 2 5 50 kg 100 50
4 Myindicator 1 1 2 6 30 kg 100 50
5 Myindicator 1 1 1 7 50 kg 70 50
6 Myindicator 1 1 1 8 20 kg 70 50
7 Myindicator 1 2 4 9 50 kg 140 70
8 Myindicator 1 2 4 9 50 kg 140 70
9 Myindicator 1 2 4 10 40 kg 140 70
10 Myindicator 1 2 5 11 20 kg 100 70
11 Myindicator 1 2 5 3 40 kg 100 70
12 Myindicator 1 2 5 3 40 kg 100 70
13 Myindicator 1 2 6 2 10 kg 10 70 *
14 Myindicator 1 3 7 12 50 kg 100 50
15 Myindicator 1 3 7 12 50 kg 100 50
16 Myindicator 1 3 8 14 15 kg 46 50 *
17 Myindicator 1 3 8 14 15 kg 46 50 *
18 Myindicator 1 3 8 13 15 kg 46 50 *
19 Myindicator 1 3 8 13 1 kg 46 50 *
Пропущено индексов: 13,16,17,18,19
Группировка по['name', 'Continent', 'Region', 'Country', 'State']
Сгруппированные суммы и сокращения для этой иерархии:
name Continent Region Country State Value Unit gsum gmax
0 Myindicator 1 1 3 1 50 kg 50 25
1 Myindicator 1 1 3 4 50 kg 50 25
2 Myindicator 1 1 2 5 20 kg 70 35
3 Myindicator 1 1 2 5 50 kg 70 35
4 Myindicator 1 1 2 6 30 kg 30 35 *
5 Myindicator 1 1 1 7 50 kg 50 25
6 Myindicator 1 1 1 8 20 kg 20 25 *
7 Myindicator 1 2 4 9 50 kg 100 50
8 Myindicator 1 2 4 9 50 kg 100 50
9 Myindicator 1 2 4 10 40 kg 40 50 *
10 Myindicator 1 2 5 11 20 kg 20 40 *
11 Myindicator 1 2 5 3 40 kg 80 40
12 Myindicator 1 2 5 3 40 kg 80 40
14 Myindicator 1 3 7 12 50 kg 100 50
15 Myindicator 1 3 7 12 50 kg 100 50
Пропущено индексов: 4,6,9,10
Финальный стол:
name Continent Region Country State Value Unit
0 Myindicator 1 1 3 1 50 kg
1 Myindicator 1 1 3 4 50 kg
2 Myindicator 1 1 2 5 20 kg
3 Myindicator 1 1 2 5 50 kg
5 Myindicator 1 1 1 7 50 kg
7 Myindicator 1 2 4 9 50 kg
8 Myindicator 1 2 4 9 50 kg
11 Myindicator 1 2 5 3 40 kg
12 Myindicator 1 2 5 3 40 kg
14 Myindicator 1 3 7 12 50 kg
15 Myindicator 1 3 7 12 50 kg