global python df日期处理 groupby agg 众数 rename

昨天主要的事情就是做特征工程,做了一天完成了部分可复用的函数,完成了700左右的变量,把一些遇到的知识点,做一下回顾。

1. python中全局变量,全局变量可以在函数内部正常引用,但是如果要修改需要加global关键字,特别地,如果list和dict修改内部的值可以不用global声明

2. pd.read_csv('XXX.csv', parse_dates=['column_name'])中有参数可以指定需要解析成date的行,读入到dataframe后字段类型是datetime64[ns],如果一个常数需要和这些date进行交互,需要用到import datetime这个结构,构造一个日期常量,datetime.datetime.strptime('2016-09-01','%Y-%m-%d'),这个对象可以直接和datetime64[ns]这个dtype进行运算,但是相减的话得到的是一个XXX days的返回,这个仍然属于datetime64[ns]结构,我只想要其中的天数,需要去掉days,这个时候可以用类似于这种(end_time - df['loan_time']).dt.days得到天数

3. 日期时间加减一个时间常量,形如end_time - datatime.timedelta(days=9),要用到datetime这个模块的timedelta来构造timedelta对象

4. groupby方法有一个参数as_index=True,这个参数的作用是把被groupby的字段是否设置为索引,默认是True,False的话,被groupby的字段作为返回dataframe的第一列

5. groupby后的对象叫做DataFrameGroupby,如果groupby后选择了某一列,这个时候的类型是SeriesGroupby类型,对于SeriesGroupby类型,有一个方法可以一次运行很多聚合函数,甚至可以自己去定义聚合函数,这个方法是agg,是aggregate的简写,可以传一个list进去,比如
df_loan.groupby('uid')['loan_amount'].agg(['sum','max',f1,f2]),对于内置的方法可以直接传方法名称的字符串,比如max/min/sum,对于自己定义的函数,传函数名,这里要注意如果是lambda函数只能传递一个进去,传多个会报错,包括是用f1 = lambda .....   f2 = lambda .... 都会报错,因为f1.__name__和f2.__name__都是<lambda>,所以后我都是自己用def定义的函数

6. 有些统计量的计算并没有现成的函数,需要自己去实现相关逻辑,但是结合pandas一些现成的方法,实现起来非常优雅。只需要明确一点agg函数获得的输入是groupby后的一个series,所以求众数就可以x.value_counts().index[0],因为value_counts()方法天然地按count排序

7. 我还发现一个可能是bug的地方,就是groupby设置了as_index=False,但是如果agg传的是一个list,我发现这个as_index=False就不会起作用,留坑,暂时没去寻求解决方案,我目前的解决办法是在后面生成的dataframe中链式的加入.reset_index(),这样index就变成了第一个column

8. df['uid']这样选出来的肯定是一个series,如果要变成dataframe,可以pd.DataFrame(df['uid'])强行转换成只有1列的dataframe

9. dataframe的raname方法是传一个dict,key是原来的column name,value是新的column,
比如df.rename(columns={'colA':'colnew'}),这里我的实践发现是必须注明参数名columns。Series可以直接rename,传一个str就可以

留言

熱門文章