我会再试一次:
import pandas as pd
import numpy as np
np.random.seed(42)
Num_members = int(10)
Num_groups = int(1)
members = pd.DataFrame({
'ID': np.arange(Num_members),
'groupID': np.random.random_integers(0, 2*Num_groups, Num_members),
'groupmass': np.zeros(Num_members),
'brightness': np.random.uniform(8,12, Num_members),
'color':np.random.uniform(0,1,Num_members)
})
还有逻辑:
df = members.groupby("groupID").agg({"brightness": np.max})
df = df.reset_index()
df = df.merge(members[["groupID", "brightness", "color"]], on=("groupID", "brightness"))
首先我们进行分组以找到最大的brightness 值。之后我们将df 与members 结合起来,得到brightness 值最高的成员的color 值。基本上,我们将members 和df 中具有相同brightness 和groupID 值的所有行组合起来。
请注意,如果组中有多个得分最高的值,这可能会导致意外的行重复。
df 现在看起来如下:
groupID brightness color
0 0 11.879639 0.139494
1 1 8.849356 0.366362
2 2 11.329771 0.292145
对于每个组,它包含groupID、brightness 的最大值和具有最大亮度值的元素的color。
我们现在可以合并数据帧members 和df:
result = members.merge(df, on="groupID", suffixes=("_member", "_group"))
得到以下结果:
ID brightness_member color_member groupID groupmass brightness_group color_group
0 0 8.232334 0.304242 2 0 11.329771 0.292145
1 2 10.404460 0.431945 2 0 11.329771 0.292145
2 3 10.832290 0.291229 2 0 11.329771 0.292145
3 6 11.329771 0.292145 2 0 11.329771 0.292145
4 8 8.727300 0.456070 2 0 11.329771 0.292145
5 9 8.733618 0.785176 2 0 11.329771 0.292145
6 1 11.464705 0.524756 0 0 11.879639 0.139494
7 4 8.082338 0.611853 0 0 11.879639 0.139494
8 5 11.879639 0.139494 0 0 11.879639 0.139494
9 7 8.849356 0.366362 1 0 8.849356 0.366362