我有一个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/

10-09 20:21