Python 使用预先定义的组对数据帧进行分组

Python 使用预先定义的组对数据帧进行分组,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我想知道,当我有预定义的组,并且元素可能同时属于多个组时,如何有效地执行类似于groupby的操作 假设我有以下DataFrame: df=pd.DataFrame({'value':[0,2,4]},索引=['A','B','C'])) 值 A 0 B 2 C4 我有以下预定义的组,它们可能重叠,大小不同: groups={'group1':['A','B'], '第2组':['A','B','C']} 现在,我想对DataFrame组执行一个函数。例如,我想计算每组值的平均值 我想创建

我想知道,当我有预定义的组,并且元素可能同时属于多个组时,如何有效地执行类似于
groupby
的操作

假设我有以下
DataFrame

df=pd.DataFrame({'value':[0,2,4]},索引=['A','B','C']))
值
A 0
B 2
C4
我有以下预定义的组,它们可能重叠,大小不同:

groups={'group1':['A','B'],
'第2组':['A','B','C']}
现在,我想对
DataFrame
组执行一个函数。例如,我想计算每组
值的平均值

我想创建一个中间的“扩展的”
DataFrame
,我可以在上面运行一个
groupby

intermediate\u df=pd.DataFrame(列=['id','group','value'])
中间值['value']=中间值['value'].aType(浮点)
对于组,组中的成员。项()
对于id_uuu成员:
行=pd.系列([id_uu2;,组,df.at[id_2;,'值']],
索引=['id','group','value'])
intermediate_df=intermediate_df.append(行,忽略索引=True)
id组值
0 A组1 0.0
1b组12.0
2 A组2 0.0
3 B组2.0
4 C组2 4.0
那我就可以了

intermediate_df.groupby('group').mean()
这会给我想要的结果:

值
团体
第1组1.0
第2组2.0

当然,我创建这个中间数据帧的方法绝对是低效的。对于我的问题,什么是有效的解决方案?

您可以创建您的
中间文件
,包括以下内容:

intermediate_df = pd.concat([df.loc[v].assign(group=k) for k, v in groups.items()])
[外]


编辑不均匀组的尝试:

pd.DataFrame().from_dict(groups, orient='index').T.stack().map(df.squeeze()).mean(level=1)
您也可以这样做:

pd.DataFrame(groups).stack().map(df.squeeze()).mean(level=1)
输出:

group 1    1
group 2    2
dtype: int64

在前面的答案的基础上,我将列表理解用于
intermediate\u df

intermediate_df=pd.DataFrame([[group,id_u]表示组,members in groups.items()表示id_uin members],
列=['group','id'])。合并(df,左索引=True)
与其他答案相比,这似乎是最快的解决方案:

n=10000
m=1000
df=pd.DataFrame({'value':np.random.normal(size=n)},index=np.arange(n).astype(str))
groups={str(i):范围(m)内i的列表(df.sample(5.index)}
%%timeit
intermediate_df=pd.concat([df.loc[members].assign(group=group)for group,members in groups.items())
中间值分组比('group')。平均值()
每个回路948 ms±63.8 ms(7次运行的平均值±标准偏差,每个回路1次)
%%时间
pd.DataFrame(groups).stack().map(df.squence()).mean(level=1)
每个回路42.4 ms±183µs(7次运行的平均值±标准偏差,每个10个回路)
%%时间
intermediate_df=pd.DataFrame([[group,id_u3;]代表组,groups中的成员。items()代表id_3;in成员],
列=['group','id'])。合并(df,左索引=True)
中间值分组比('group')。平均值()
每个回路6.13 ms±50.1µs(7次运行的平均值±标准偏差,每个100个回路)

谢谢!不幸的是,我忘记指定组的大小可能不同。那么,你的答案不起作用了,但这是我的错。我更新了问题。
group 1    1
group 2    2
dtype: int64