我有以下数据框:
obj_id data_date value
0 4 2011-11-01 59500
1 2 2011-10-01 35200
2 4 2010-07-31 24860
3 1 2009-07-28 15860
4 2 2008-10-15 200200
我想获取此数据的子集,以便我只有每个 'obj_id 的最新(最大
。 'data_date'
)'value'
'
我想出了一个解决方案,但感觉很脏。我想知道是否有人有更好的方法。我敢肯定我一定错过了一些通过 Pandas 来做到这一点的简单方法。
我的方法本质上是按如下方式进行分组、排序、检索和重组:
row_arr = []
for grp, grp_df in df.groupby('obj_id'):
row_arr.append(dfg.sort('data_date', ascending = False)[:1].values[0])
df_new = DataFrame(row_arr, columns = ('obj_id', 'data_date', 'value'))
最佳答案
如果“obj_id”的数量非常多,您需要对整个数据帧进行排序,然后删除重复项以获取最后一个元素。
sorted = df.sort_index(by='data_date')
result = sorted.drop_duplicates('obj_id', keep='last').values
这应该会更快(抱歉我没有测试),因为你不必做自定义的 agg 函数,当有大量键时会很慢。您可能认为对整个数据帧进行排序会更糟糕,但在实践中,python 排序速度很快,而原生循环很慢。
关于python - pandas - 获取由另一列索引的特定列的最新值(获取由另一列索引的特定列的最大值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850954/