我有一个通过df.pivot创建的数据框:
type start end
F_Type to_date
A 20150908143000 345 316
B 20150908140300 NaN 480
20150908140600 NaN 120
20150908143000 10743 8803
C 20150908140100 NaN 1715
20150908140200 NaN 1062
20150908141000 NaN 145
20150908141500 418 NaN
20150908141800 NaN 450
20150908142900 1973 1499
20150908143000 19522 16659
D 20150908143000 433 65
E 20150908143000 7290 7375
F 20150908143000 0 0
G 20150908143000 1796 340
我想为每个'F_TYPE'过滤并返回一行,只返回带有Maximum'to_date'的行。我想返回以下数据框:
type start end
F_Type to_date
A 20150908143000 345 316
B 20150908143000 10743 8803
C 20150908143000 19522 16659
D 20150908143000 433 65
E 20150908143000 7290 7375
F 20150908143000 0 0
G 20150908143000 1796 340
谢谢..
答案 0 :(得分:30)
标准方法是使用groupby(keys)[column].idxmax()
。
但是,要使用idxmax
选择所需的行,您需要idxmax
来返回唯一索引值。获取唯一索引的一种方法是调用reset_index
。
从groupby(keys)[column].idxmax()
获取索引值后,您可以使用df.loc
选择整行:
In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]:
start end
F_Type to_date
A 20150908143000 345 316
B 20150908143000 10743 8803
C 20150908143000 19522 16659
D 20150908143000 433 65
E 20150908143000 7290 7375
F 20150908143000 0 0
G 20150908143000 1796 340
注意:idxmax
返回索引标签,不一定是序数。使用reset_index
后,索引标签也恰好是序数,但由于idxmax
返回标签(而不是序数),因此总是使用idxmax
更好使用df.loc
,而不是df.iloc
(正如我最初在此帖中所做的那样。)
答案 1 :(得分:1)
其他方法如下:
(
df
.groupby(level=0)
.apply(lambda group: group.nlargest(1, columns='to_date'))
.reset_index(level=-1, drop=True)
)
(
df
.groupby(level=0)
.apply(lambda group: group.loc[group['to_date'] == group['to_date'].max()])
.reset_index(level=-1, drop=True)
)