Python 具有选择条件的数据帧中的有效最大选择

Python 具有选择条件的数据帧中的有效最大选择,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个熊猫数据框,其中包括user\u id和start\u time列。我希望高效、易读地查找与每个用户的最大开始时间相关联的所有行 例如,如果这是我的数据: user_id start_time A B C 1 37 a b c 1 45 d e f 1 45 g h i 2 58 j

我有一个熊猫数据框,其中包括
user\u id
start\u time
列。我希望高效、易读地查找与每个用户的最大
开始时间相关联的所有行

例如,如果这是我的数据:

user_id   start_time   A    B    C
1         37           a    b    c
1         45           d    e    f
1         45           g    h    i
2         58           j    k    l
2         17           m    n    o
2         58           p    q    r
3          2           s    t    u
然后我希望能找到

user_id   start_time   A    B    C
1         45           d    e    f
1         45           g    h    i
2         58           j    k    l
2         58           p    q    r
3          2           s    t    u
我已经提出了一些类似的解决方案,但这会发现
用户id
具有最新的
开始时间
,而不是每个用户max
开始时间的表选择

当然,手工迭代数据帧很容易,但效率很低

谢谢你的指点

为了方便将来的读者,生成数据帧如下:

columns = ['user_id', 'start_time', 'A', 'B', 'C']
LoL = [
    [1, 37, 'a', 'b', 'c'],
    [1, 45, 'd', 'e', 'f'],
    [1, 45, 'g', 'h', 'i'],
    [2, 58, 'j', 'k', 'l'],
    [2, 17, 'm', 'n', 'o'],
    [2, 58, 'p', 'q', 'r'],
    [3, 2, 's', 't', 'u']]
pd.DataFrame = (LoL, columns=columns)

您可以按user_id列分组,然后调用
apply
并传递lambda,该lambda过滤开始时间等于最大值的结果,我们希望由此生成布尔索引。然后,我们可以调用
reset\u index
,但由于筛选groupby的方式,我们将获得重复列的错误,因此我们必须删除此重复列:

In [66]:

gp = df.groupby('user_id')
gp.apply(lambda x: x[x['start_time'] == x['start_time'].max()]).reset_index(drop=True)

Out[66]:
   user_id  start_time  A  B  C
0        1          45  d  e  f
1        1          45  g  g  i
2        2          58  j  k  l
3        2          58  p  q  r
4        3           2  s  t  u
如果我们没有调用
reset\u index
您会得到重复的值:

In [67]:

gp.apply(lambda x: x[x['start_time'] == x['start_time'].max()])
Out[67]:
           user_id  start_time  A  B  C
user_id                                
1       1        1          45  d  e  f
        2        1          45  g  g  i
2       3        2          58  j  k  l
        5        2          58  p  q  r
3       6        3           2  s  t  u
内部布尔条件在多索引上生成布尔掩码,然后需要将其传递给lambda以生成上述内容:

In [68]:

gp.apply(lambda x: x['start_time'] == x['start_time'].max())
Out[68]:
user_id   
1        0    False
         1     True
         2     True
2        3     True
         4    False
         5     True
3        6     True
Name: start_time, dtype: bool

或者,您可以执行以下操作:

df[df.start_time == df.groupby('user_id')['start_time'].transform(max)]
这将产生:

   user_id  start_time  A  B  C
1        1          45  d  e  f
2        1          45  g  h  i
3        2          58  j  k  l
5        2          58  p  q  r
6        3           2  s  t  u

在一个大得多的数据集上,与ajcr和Primer解决方案的1345毫秒相比,这需要790毫秒。(它们在我看来都是正确的。)我很想知道groupby()和merge()方法与下面的其他答案相比,在您的大框架上的表现如何。你能试试吗?g=df.groupby('user\u id',as\u index=False)['start\u time'].max()df.merge(g)