對于可以使用下面的代碼派生的示例資料框,我想更新列,以便對于列中不在列Offset_Date
中的任何日期,我想用列中的最后一個可用值替換該日期。Offset_Date
Date
Offset_Date
Date
data = {"date": ['2021-01-01', '2021-01-03', '2021-01-04', '2021-01-05',
'2021-01-07', '2021-01-09', '2021-01-10', '2021-01-11'],
"offset_date": ['2021-01-02', '2021-01-04', '2021-01-05',
'2021-01-06', '2021-01-08', '2021-01-10',
'2021-01-11', '2021-01-12']}
test_df = pd.DataFrame(data)
test_df['date'] = pd.to_datetime(test_df['date'])
test_df['offset_date'] = pd.to_datetime(test_df['offset_date'])
為了在上述資料框的第一行中進一步解釋,日期2021-01-02
不在列內date
,所以我想用列中的最后一個可用值替換該值,date
即 2021-01-01
。
我想執行矢量化方法,所以我嘗試了以下方法,這導致了不正確的結果。
test_df['offset_date_upd'] = np.where(test_df['offset_date'] in test_df['date'].values,
test_df['offset_date'],
test_df[test_df['date'] <= test_df['offset_date']].values.max())
如何使用矢量化方法獲得以下所需的輸出?
期望的輸出
------------ -------------
| Date | Offset_Date |
------------ -------------
| 2021-01-01 | 2021-01-01 |
| 2021-03-01 | 2021-04-01 |
| 2021-04-01 | 2021-05-01 |
| 2021-05-01 | 2021-05-01 |
| 2021-07-01 | 2021-07-01 |
| 2021-09-01 | 2021-10-01 |
| 2021-10-01 | 2021-11-01 |
| 2021-11-01 | 2021-11-01 |
------------ -------------
uj5u.com熱心網友回復:
IIUC,您可以使用isin
、mask
和fillna
:
test_df['offset_date'] = (test_df['offset_date']
.where(test_df['offset_date'].isin(test_df['date']),
test_df['date'])
)
輸出:
date offset_date
0 2021-01-01 2021-01-01
1 2021-01-03 2021-01-04
2 2021-01-04 2021-01-05
3 2021-01-05 2021-01-05
4 2021-01-07 2021-01-07
5 2021-01-09 2021-01-10
6 2021-01-10 2021-01-11
7 2021-01-11 2021-01-11
uj5u.com熱心網友回復:
這就是 Pandasmerge_asof
功能的目的。
我們必須具體說明哪些列在哪里。這將作為左連接作業,在這種情況下,我們想要'offset_date'
表示“左”。然后,對于 中的每個值'offset_date'
,我們尋找'date'
不超過 中的值的最大值'offset_date'
。
這種方法的一個問題是兩列都需要排序。如果這是真實資料的問題,請告訴我,我將在底部添加一個處理此問題的部分。
new_offset_date = pd.merge_asof(
test_df[['offset_date']], # limit `test_df` to just the column I need for the merge
test_df[['date']], # limit `test_df` to just the other column I need
left_on=['offset_date'], # name the columns since they have different names
right_on=['date'] # name the other column as well
)['date']
現在新日期在 a 中pandas.Series
,如果我們使用不會assign
覆寫您的資料框的方法,我們可以看到它,并且您需要使用它來實際將新日期保留在資料框中。test_df = test_df.assign(offset_date=new_offset_date)
test_df.assign(offset_date=new_offset_date)
date offset_date
0 2021-01-01 2021-01-01
1 2021-01-03 2021-01-04
2 2021-01-04 2021-01-05
3 2021-01-05 2021-01-05
4 2021-01-07 2021-01-07
5 2021-01-09 2021-01-10
6 2021-01-10 2021-01-11
7 2021-01-11 2021-01-11
uj5u.com熱心網友回復:
波紋管方法應該適用于您的情況
test_df["offset_date"] = np.where(
test_df.offset_date.isin(test_df.date),
test_df.offset_date,
test_df.date
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454542.html