pandas是数据挖掘常用的工具包,内容全面丰富,使用简单。现将日常使用到的比较高级却容易忘记的功能记录下来。
本篇持续更新,用到哪些该记录的就会更新记录。话不多说,现在开始。
一、shift / rolling / rank 的使用
1、shift -- 数据移动
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns=['AA','BB','CC','DD'],
index =['a','b','c','d'])
df.shift(-1) # 上移
df.shift(1) # 下移
df.shift(-1,axis = 1) # 左移
df.shift(1,axis = 1) # 右移
分组后组内移动
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
'2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
'num': [1,2,1,3,4,2,1],
'ds': [pd.to_datetime('20130103'),pd.to_datetime('20130102'),
pd.to_datetime('20130101'),pd.to_datetime('20130107'),
pd.to_datetime('20130105'),pd.to_datetime('20130106'),
pd.to_datetime('20130104')]})
df_01 = df.groupby(['1','2']).apply(lambda x: x.sort_values('ds', ascending=True)).reset_index(drop=True)
df_02 = pd.DataFrame(df_01.groupby(['1','2'])['num'].shift(1))
df_03 = pd.concat([df_01,df_02],axis=1)
df_03
2、rolling -- 滚动滑窗
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
'''
window:表示时间窗的大小;
min_periods:最少需要有值的观测点的数量;
center:是否使用window的中间值作为label
'''
df.rolling(3, min_periods=1).sum()
df.rolling(3, min_periods=2).sum()
df.rolling(3, min_periods=1, center=True).sum()
分组滑窗统计
df = pd.DataFrame({'1': ['A1', 'A2', 'A1', 'A2', 'A2', 'A1', 'A2'],
'2': ['B1', 'B1', 'B1', 'B1', 'B1', 'B1', 'B1'],
'num': [1,2,1,3,4,2,1],
'ds': [pd.to_datetime('20130103'),pd.to_datetime('20130102'),
pd.to_datetime('20130101'),pd.to_datetime('20130107'),
pd.to_datetime('20130105'),pd.to_datetime('20130106'),
pd.to_datetime('20130104')]})
df_01 = df.groupby(['1','2']).apply(lambda x: x.sort_values('ds', ascending=True)).reset_index(drop=True)
df_02 = pd.DataFrame(df_01.groupby(['1', '2'])['num'].rolling(1).mean()).reset_index(drop=True)
df_03 = pd.concat([df_01,df_02],axis=1)
df_03
3、rank -- 组内排序
list1 = [1, 3, 1,0,7,4,0]
list2 = [3, 3, 2,0,4,4,5]
list3 = [3, 3, 3,3,4,4,6]
df1 = pd.DataFrame({'col1':list1,'col2':list2,'col3':list3})
df2 = df1.groupby(['col3']).rank(method='min',ascending=False)
df3 = df1.groupby(['col3']).rank(method='max',ascending=False)
df2
df3