簡體   English   中英

獲取Pandas DataFrame每個元素的最新信息,以及范圍索引和日期列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM