在Pandas datafram中高效地查找一列的最大值

2024-04-19 03:57:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个非常大的数据帧(350万X 150,取消拾取时需要25G内存),我需要在id号和日期上找到最多一列,并且只保留具有最大值的行。每一行是一个id在某个日期的记录观察,我还需要最新的日期。在

这是动物测试数据,每个id和日期有20个附加列seg1-seg20,这些列连续填充测试日信息,例如,第一个测试数据填充seg1,第二个测试数据填充seg2等。“value”字段表示已经填充了多少段,换句话说,已经完成了多少个测试,因此“value”最大的行拥有最多的测试数据。理想情况下,我只想要这些行,而不是前面的行。例如:

df= DataFrame({'id':[1000,1000,1001,2000,2000,2000], 
          "date":[20010101,20010201,20010115,20010203,20010223,20010220],
          "value":[3,1,4,2,6,6], 
          "seg1":[22,76,23,45,12,53],
          "seg2":[23,"",34,52,24,45],
          "seg3":[90,"",32,"",34,54],
          "seg4":["","",32,"",43,12],
          "seg5":["","","","",43,21],
          "seg6":["","","","",43,24]})
df
       date    id  seg1 seg2 seg3 seg4 seg5 seg6  value
0  20010101  1000    22   23   90                     3
1  20010201  1000    76                               1
2  20010115  1001    23   34   32   32                4
3  20010203  2000    45   52                          2
4  20010223  2000    12   24   34   43   43   41      6
5  20010220  2000    12   24   34   43   44   35      6

最终应该是:

^{pr2}$

我第一次尝试使用.groupby('id').max,但找不到方法来删除行。结果数据帧必须包含原始行,而不仅仅是每个id的每列的最大值。我当前的解决方案是:

for i in df.id.unique():
    df =df.drop(df.loc[df.id==i].sort(['value','date']).index[:-1])

但是每次运行大约需要10秒,我想是因为它每次都试图调用整个数据帧。共有760000个唯一的ID,每个ID都有17位数字长,因此以这种速度进行操作需要太长的时间。在

有没有其他更有效的方法?目前,它将每一列都作为一个“对象”读取,但是将相关列转换为整数的最低位似乎也没有帮助。在


Tags: 数据方法内存iddfdatevalue测试数据
1条回答
网友
1楼 · 发布于 2024-04-19 03:57:28

我试过使用groupby('id').max(),它起作用了,它还删除了行。您记得重新分配了df变量吗?因为这个行动(以及几乎所有大熊猫的行动)都没有到位。在

如果您这样做:

df.groupby('id', sort = False).max()

您将获得:

^{pr2}$

如果您不希望id作为索引,您可以:

df.groupby('id', sort = False, as_index = False).max()

你将得到:

     id      date  value
0  1000  20010201      3
1  1001  20010115      4
2  2000  20010223      6

不过,我不知道这会不会快得多。在

更新

这样就不会重置索引:

df.iloc[df.groupby('id').apply(lambda x: x['value'].idxmax())]

你将得到:

           date    id  seg1 seg2 seg3 seg4 seg5 seg6  value
0  20010101  1000    22   23   90                     3
2  20010115  1001    23   34   32   32                4
4  20010223  2000    12   24   34   43   43   43      6

相关问题 更多 >