groupby后sort_values、reset_index(drop=True)、时间Series.dt、pd.Timestamp等价datetime.datetime、pd.Timedelta等价datetime.timedelta、pivot中的values参数、nunique、shift、diff、total_seconds、np.nan == np.nan

今天干的事情比较单纯就是撸代码,跟一遍JDD 17th solution,学到很多pandas相关的东西,果然不断写代码,看代码,模仿别人的代码是提升最快的。

我重新换回了ide spyder,我发现ide是有优势的,比如notebook去观察变量的值,我一般是新建一个cell,然后打变量名字,看了变量的内容,又删除这个cell,其实新建和删除都是废操作,而在ide里面有variable explorer视窗,有ipython的命令行,都可以很便捷的访问内存中的变量,相当于是一种代码和查看的分离机制,我觉得notebook的优势应该是在于展示,还有就是打草稿也比较方便。

然后继续看代码,发现本质就是按照uid和time进行排序,但是对方写得很复杂,用了groupby,然后再对每一个分组进行排序,这个不就是直接按两个字段进行排序吗?

reset_index(drop=True)会直接drop掉索引,并且重新用0,1,2...进行编码,reset_index()也会把多层次的索引给drop掉。

另外抽取时间,对方的方法也比较累赘,也是对每一个pd.Timestamp对象进行x.month的抽取,实际上可以直接对整个series进行操作,Series.dt.month

pd.Timestamp就可以认为等于python的datetime,我以前做时间相减的时候是
import datetime
time1 = datetime.datetime.strptime('2018-02-01','%Y-%m-%d')
time2 = time1 - datetime.timedelta(days=30)
其实就直接等价于
pd.Timestamp('2018-02-01') 而且不用去指明字符串的类时间格式

接下来遇到的就是df.pivot,这个我之前研究行列互转的时候用的是df.pivot(index='col1',columns='col2'),然后除了col1和col2以外的column都会形成一个pivot table,这个方法还有第三个参数df.pivot(index='col1',columns='col2',values='col3'),这个时候生成的列名不是多重索引,就是一重的,column name就是col2的不同value,但是如果value想取多个column怎么办,文档上说values这个参数接收的对象是string或者object,我试了试list,不行,要实现这个目的的一种写法df.pivot(index='col1',columns='col2')['col3','col4'],多字段的话,column name就是二重索引了

接下来是用户在不同日期点击数,和不同页面点击数,就是按uid和pid regroup,然后每个分组的length,其实已经有现成的方法,nuique,返回Series不同元素个数,所以自然groupbySeries结构也有这一方法,所以直接通过tmp.groupby(['uid'])['date','pid'].nunique()很容易求出.

接下来遇到的新东西是一个叫shift的方法,Series和DataFrame都有shift方法,效果很简单,就是把记录下移offset行,负数应该是上移?shift移动后,比如shift down 1 row,最上面行变成一个NaT的值,应该相当于空值(按组shift的时候,只有一个元素的组shift后自然就是NaT),具体到这里的代码,因为dataframe本身按组按时间排序了,所以按组shift一行,然后相减,得到两个time的间隔,NaT和一个时间相减出来的是NaT。其实这里只是实现按组一阶差分,可以直接用差分的方法diff(),用shift麻烦了,df.groupby('uid')['click_time'].diff().dt.total_seconds()

两个时间Series相减得到dtype类型是timedelta64[ns],其中每一个元素的类是pandas._libs.tslib.Timedelta,也就是pd.Timedelta,这个就等价于datetime.timedelta,类似于pd.Timestamp,所以方法也和datetime.timedelta相似,求两个时间差值的总秒数,total_seconds()方法得到,total_seconds()是datetime.timedelta的方法,如果对于Series,可以apply针对每一个元素,也可以用Series.dt.total_seconds(),感觉每个元素单独用的方法,加上dt就可以应用于整个Series

np.nan == np.nan 结果是False,所以含NaN的两个Series比较时,即便其他的元素都是对应相等,但是NaN的行就不会相等

求mean时,如果有NaN将不参与运算,比如三个元素其中一个NaN,那么结果就是剩余2个的均值











留言

熱門文章