Мне интересно, как эффективно сделать что-то вроде groupby
, когда у меня есть предопределенные группы, и элементы могут принадлежать нескольким группам одновременно.
Предположим, у меня есть следующее DataFrame
:
df = pd.DataFrame({'value': [0, 2, 4]}, index=['A', 'B', 'C'])
value
A 0
B 2
C 4
и у меня есть следующие предопределенные группы, которые могут перекрываться и иметь другой размер:
groups = {'group 1': ['A', 'B'],
'group 2': ['A', 'B', 'C']}
Теперь я хочу выполнить функцию на DataFrame
группы.Например, я хочу вычислить среднее значение value
для каждой группы.
Я думал о создании промежуточного "расширенного" DataFrame
, на котором я мог бы запустить groupby
:
intermediate_df = pd.DataFrame(columns=['id', 'group', 'value'])
intermediate_df['value'] = intermediate_df['value'].astype(float)
for group, members in groups.items():
for id_ in members:
row = pd.Series([id_, group, df.at[id_, 'value']],
index=['id', 'group', 'value'])
intermediate_df = intermediate_df.append(row, ignore_index=True)
id group value
0 A group 1 0.0
1 B group 1 2.0
2 A group 2 0.0
3 B group 2 2.0
4 C group 2 4.0
Затем я мог бы сделать
intermediate_df.groupby('group').mean()
, который дал бы мне желаемый результат:
value
group
group 1 1.0
group 2 2.0
Конечно, способ создания этого промежуточного звена DataFrame
абсолютно неэффективен.Что будет эффективным решением для моей проблемы?