我有一个pandas数据框,有很多行。我正在尝试根据成员的组内排名顺序为框架创建新列。以下是一些虚假数据,说明了我所拥有的:
Num_members = int(1.e7) Num_groups = int(1.e5) 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) })
我正在尝试为成员创建两个新列:
组内亮度的排名顺序,使最亮的
组中的成员将得到值0、下一个最亮的1等。
组中最亮的成员的颜色因此,对于此列,将为同一组的所有成员分配相同的值,该值等于组内亮度等级为0的成员的“颜色”。
我知道groupby操作正是为这种操作而设计的,但是我还没有找到正确的方法。速度是一个很重要的问题,因为我的数据集很大,我需要在mcmc似然分析中完成这项工作。
最佳答案
我再试试:
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结合起来,得到color值最高的成员的brightness值。基本上,我们将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:
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
关于python - 使用 Pandas 基于组内排名创建新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28137651/