Pandas 解決dataframe的一列進(jìn)行向下順移問(wèn)題
最近做比賽,有時(shí)候需要造出新的特征,而這次遇到的問(wèn)題是將一列數(shù)據(jù)往下順移一位。同時(shí)將開頭缺失的那一個(gè)數(shù)據(jù)用其他方式填充。
df['feature'].shift(1)向下順移一位,這時(shí)第一位會(huì)置為nan,需要填充。
----------------------歷史分割線-----------------
錯(cuò)誤方案:
當(dāng)時(shí)首先想到的是用loc來(lái)直接進(jìn)行替換,也就是
i = len(dt) dt_new = pd.DataFrame() dt_new.loc[0, 'test'] = 0 dt_new.loc[1 : i - 1, 'test'] = dt.loc[0 : i - 2, 'data'] #這里會(huì)報(bào)錯(cuò)
愿望很美好,現(xiàn)實(shí)很殘酷,這種方法會(huì)報(bào)錯(cuò)。
不太好的方案:
于是打算用循環(huán)的辦法一個(gè)一個(gè)替換
dt_new = pd.DataFrame() dt_new.loc[0, 'test'] = 0 for i in range(len(dt) - 1): dt_new.loc[i + 1, 'test'] = dt.loc[i, 'data']
然而這個(gè)僅僅O(n)算法復(fù)雜度的東西,實(shí)際檢驗(yàn)當(dāng)用在幾萬(wàn)行數(shù)據(jù)真的可以給你算好久好久,所以這個(gè)辦法也棄用了。
正確方案:
pandas的dataframe,每一行是有序號(hào)的,直接進(jìn)行替換的話,有時(shí)它會(huì)將相同序號(hào)的進(jìn)行替換,這個(gè)是dataFrame的特性,有時(shí)會(huì)忽略從你選擇的那一行開始替換,而直接從0開始。所以如果想用pandas來(lái)進(jìn)行順位移動(dòng)的話,目前沒有在API中找到便捷的方法。
最后終于想到了另外一個(gè)辦法,就是轉(zhuǎn)化為Numpy數(shù)組進(jìn)行移動(dòng)后,再轉(zhuǎn)回dataFrame。
dt_v = dt['data'].values dt_v = dt_v.flatten() i = len(dt) dt_new_v = np.zeros(i) dt_new_v[0] = 0 dt_new_v[1 : i] = dt_v[0 : i - 1] #這里要注意Numpy數(shù)組截取[1, i]實(shí)際截取的是[1, i - 1]行! dt_new = pd.DataFrame() dt_new['test'] = dt_new_v
要注意Numpy數(shù)組截取[1, i]實(shí)際截取的是第[1, i - 1]行!
以上這篇Pandas 解決dataframe的一列進(jìn)行向下順移問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python報(bào)錯(cuò)NameError: name ‘secrets‘ is not
在使用Python進(jìn)行安全編程時(shí),我們經(jīng)常需要使用secrets模塊來(lái)生成安全的隨機(jī)數(shù),但是卻遇到這個(gè)問(wèn)題,本文主要介紹了Python報(bào)錯(cuò)NameError: name ‘secrets‘ is not defined解決,感興趣的可以了解一下2024-06-06Python pandas遍歷行數(shù)據(jù)的2種方法小結(jié)
pandas在數(shù)據(jù)處理過(guò)程中,除了對(duì)整列字段進(jìn)行處理之外,有時(shí)還需求對(duì)每一行進(jìn)行遍歷,本文就來(lái)介紹Python pandas遍歷行數(shù)據(jù)的2種方法小結(jié),感興趣的可以了解一下2024-03-03python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中
這篇文章主要介紹了python3使用logging包,如何把日志寫到系統(tǒng)的rsyslog中的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09