Pandas 解决dataframe的一列进行向下顺移问题
最近做比赛,有时候需要造出新的特征,而这次遇到的问题是将一列数据往下顺移一位。同时将开头缺失的那一个数据用其他方式填充。
df['feature'].shift(1)向下顺移一位,这时第一位会置为nan,需要填充。
----------------------历史分割线-----------------
错误方案:
当时首先想到的是用loc来直接进行替换,也就是
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']#这里会报错
愿望很美好,现实很残酷,这种方法会报错。
不太好的方案:
于是打算用循环的办法一个一个替换
dt_new=pd.DataFrame() dt_new.loc[0,'test']=0 foriinrange(len(dt)-1): dt_new.loc[i+1,'test']=dt.loc[i,'data']
然而这个仅仅O(n)算法复杂度的东西,实际检验当用在几万行数据真的可以给你算好久好久,所以这个办法也弃用了。
正确方案:
pandas的dataframe,每一行是有序号的,直接进行替换的话,有时它会将相同序号的进行替换,这个是dataFrame的特性,有时会忽略从你选择的那一行开始替换,而直接从0开始。所以如果想用pandas来进行顺位移动的话,目前没有在API中找到便捷的方法。
最后终于想到了另外一个办法,就是转化为Numpy数组进行移动后,再转回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数组截取[1,i]实际截取的是[1,i-1]行! dt_new=pd.DataFrame() dt_new['test']=dt_new_v
要注意Numpy数组截取[1,i]实际截取的是第[1,i-1]行!
以上这篇Pandas解决dataframe的一列进行向下顺移问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。