[英]Get the latest of each element of a Pandas DataFrame, with range indexing and a date column?
我有一個這樣的示例DataFrame:
df = pd.DataFrame(data=[('foo', datetime.date(2014, 10, 1)),
('foo', datetime.date(2014, 10, 2)),
('bar', datetime.date(2014, 10, 3)),
('bar', datetime.date(2014, 10, 1))],
columns=('name', 'date'))
看起來像這樣:
name date
0 foo 2014-10-01
1 foo 2014-10-02
2 bar 2014-10-03
3 bar 2014-10-01
我想將數據框限制為僅在名稱列中每個元素的最后一個事件,我該怎么做?
我可能很尷尬(至少我認為這很尷尬)構造一個布爾Series對象來做到這一點,並將其傳遞給DataFrame的__getitem__
,如下所示:
pd[latest_name]
如何最優雅地獲取每個name
元素的最新條目?
一位同事對此有一個非常相似的問題。
使用這樣的DataFrame對象:
name date
0 foo 2014-10-01
1 foo 2014-10-02
2 bar 2014-10-03
3 bar 2014-10-01
您可以按日期排序,然后刪除重復項,最后保留這樣的內容:
last = df.sort(columns=('date',)).drop_duplicates(cols=('name',), take_last=True)
# note cols is deprecated in more recent versions of pandas,
# and you should use subset='name' if available to you
last
是:
name date
1 foo 2014-10-02
2 bar 2014-10-03
[2 rows x 2 columns]
但是,如果我們可以刪除舊索引,然后按索引排序,則最好將日期設置為索引:
df = df.set_index('date')
df = df.sort_index() # inplace=True is deprecated, so must assign
df
現在返回:
name
date
2014-10-01 foo
2014-10-01 bar
2014-10-02 foo
2014-10-03 bar
現在只考慮最后一個元素:
last_elements_frame = df.drop_duplicates(take_last=True)
現在last_elements_frame
是:
name
date
2014-10-02 foo
2014-10-03 bar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.