具有以下資料框:
import pandas as pd
import numpy as np
data = pd.DataFrame({'model_id': [1,1,2],
'brand': ['nike','nike','nike'],
'release_date': ['01/01/2021','01/02/2021','01/03/2021']})
data['release_date'] = pd.to_datetime(data['release_date'], format='%m/%d/%Y')
好像:
'| | model_id | brand | release_date |
|---:|-----------:|:--------|:--------------------|
| 0 | 1 | nike | 2021-01-01 00:00:00 |
| 1 | 1 | nike | 2021-01-02 00:00:00 |
| 2 | 2 | nike | 2021-01-03 00:00:00 |'
我想按model_id和brand進行分組,以獲得最大和最小日期,但是id的max_date必須是同一品牌下一個模型的最小日期,如果沒有則為NaN(model_id 2的情況)。
預期的輸出是:
"| | min_date | max_date |
|:------------|--------------------:|---------------------:|
| (1, 'nike') | 2021-01-01 00:00:00 | 2021-01-03 00:00:00 |
| (2, 'nike') | 2021-01-03 00:00:00 | NaN |"
我試過運行這個,但我無法選擇同一品牌的下一個日期。
(data.groupby(['model_id','brand'])
.agg(min_date=('release_date', np.min), max_date=('release_date', np.max))
.to_markdown()
)
注意:使用不同順序的資料框,結果不應有所不同
data = pd.DataFrame({'model_id':[2,1,2],'brand':['nike','nike','nike'],'release_date':['01/03/2021','01/02/2021','01/01/2021']})
(data
.groupby(['model_id','brand'])
.agg(min_date=('release_date', 'min'))
.assign(max_date=lambda d: d.groupby('brand')
['min_date'].shift(-1))
)
產生大于 max_date 的 min_date
"| | min_date | max_date |
|:------------|:-----------|:-----------|
| (1, 'nike') | 01/02/2021 | 01/01/2021 |
| (2, 'nike') | 01/01/2021 | nan |"
uj5u.com熱心網友回復:
每組移動 max_date
這里 max_date 定義為每個品牌前一個 id 的 min_date
(data
.groupby(['model_id','brand'])
.agg(min_date=('release_date', 'min'))
.assign(max_date=lambda d: d.groupby('brand')['min_date'].shift(-1))
#.astype(str).to_markdown() # uncomment for markdown
)
輸出:
| | min_date | max_date |
|:------------|:-----------|:-----------|
| (1, 'nike') | 2021-01-01 | 2021-01-03 |
| (2, 'nike') | 2021-01-03 | NaT |
上一個答案
之后您需要屏蔽資料:
(data
.groupby(['model_id','brand'])
.agg(min_date=('release_date', 'min'), max_date=('release_date', 'max'))
.assign(max_date=lambda d: d['max_date'].mask(d['max_date'].eq(d['min_date'])))
#.astype(str).to_markdown() # uncomment for markdown
)
輸出(作為降價):
| | min_date | max_date |
|:------------|:-----------|:-----------|
| (1, 'nike') | 2021-01-01 | 2021-01-02 |
| (2, 'nike') | 2021-01-03 | NaT |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456668.html
下一篇:將具有串列作為值的兩列合并為一列
