我正在处理一个非常大的数据帧(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位数字长,因此以这种速度进行操作需要太长的时间。在
有没有其他更有效的方法?目前,它将每一列都作为一个“对象”读取,但是将相关列转换为整数的最低位似乎也没有帮助。在
我试过使用
groupby('id').max()
,它起作用了,它还删除了行。您记得重新分配了df
变量吗?因为这个行动(以及几乎所有大熊猫的行动)都没有到位。在如果您这样做:
您将获得:
^{pr2}$如果您不希望
id
作为索引,您可以:你将得到:
不过,我不知道这会不会快得多。在
更新
这样就不会重置索引:
你将得到:
相关问题 更多 >
编程相关推荐