数据预览
# 在cmd中安装 pip install pandas-profiling import pandas_profiling pro = pandas_profiling.ProfileReport(data1) pro.to_file('output_file.html')
变化百分比
# 元素变化百分比 每个元素与其前一个元素进行比较,并计算变化百分比 df.pct_change()
协方差
# 协方差,cov用来计算序列对象之间的协方差 s1.cov(s2) df['a'].cov(df['b'])
相关性
# 相关性,pearson(默认),spearman和kendall之间的相关性 df['a'].corr(df['b'],method ='spearman') print (frame.corr())
排名
s.rank() 或者 df.rank() # (axis=0)或列(axis=1) # ascending=True 正向排名或者反向排名 # method (average :并列组平均排名,min :组中最低排名,max :组中最高等级,first :按在数组中出现的顺序分配等级)
分组计算
# 多组运算 df.groupby(['班级','性别'])['身高'].agg([np.sum,np.mean,np.std]) df.groupby(['班级','性别']).agg({'身高':['min'],'体重':['max']}) df.groupby('flee').agg({'身高': [np.median, np.mean], 'signs': np.mean}) df.agg({'A':np.sum,'B':np.mean}) # 对不同列进行不同的计算 df[['A','B']].agg([np.sum,np.mean,np.min]) # 对多个变量进行多种计算 # 时间分组 ,先用pd.to_datetime(字段,格式)将某一列转成日期格式 df.groupby(df['生日'].apply(lambda x:x.year)).count() # 分组后选第一个,一般数据先排序 df.groupby(df['生日'].apply(lambda x:x.year),as_index=False).first() # Tail(n=1) head() # 找到每组中只有一个数据的 df.groupby(df['生日'].apply(lambda x:x.month),as_index=False).filter(lambda x: len(x)==1) data2.groupby('var').filter(lambda x:len(x)>=10) data.groupby(data.index.year)['年龄'].mean() # 加权平均 final3_1 = data_jiep.groupby(['产业线','模号']).apply(lambda g: np.average(g['平均节拍'], weights=g['模次'])).reset_index() # groupby作图 data.groupby('race')['flee'].value_counts().unstack().plot(kind='bar', figsize=(20, 4)) data.groupby('flee')['age'].plot(kind='kde', legend=True, figsize=(20, 5)) # groupby中的几个函数 # 累计 df.groupby('key').aggregate('min', np.median, max) # 过滤 df.groupby('key').filter(某个函数) # 转换 df.groupby('key').transform(lambda x: x- x.mean()) #通过某一个字段分组后,选另一个字段的最小值,构成的数据 df = pd.DataFrame({'AAA': [1, 1, 1, 2, 2, 2, 3, 3],'BBB': [2, 1, 3, 4, 5, 1, 2, 3]}) df.loc[df.groupby("AAA")["BBB"].idxmin()] # 按照一个字段排序,另一个字段分组,选取第一个 df.sort_values(by="BBB").groupby("AAA", as_index=False).first() #重新设置索引 # transform后数据大小不变 df["Order_Total"] = df.groupby('order')["ext price"].transform('sum') result0 = data1.to_period('Q').groupby(level=0).apply(lambda x :len(x['var'].unique().tolist()))
交叉表
result1 = pd.crosstab(data.index,data['产业线'],margins=True)
数据透视表
df.pivot_table('价格',index='产地',columns='类别',aggfunc='max',margins=True,fill_value=0,margins_name='合计') # 用字典形式,可不用values参数 df.pivot_table(index='sex', columns='class', aggfunc={'surviced':'sum', 'fare':'mean'}) result = data.pivot_table(index=data3.to_period('M').index,columns= '是否异常',values='模号', aggfunc='count') result1 = data.pivot_table(index= 'var1',columns=data['var3'].apply(lambda x: x.strftime('%Y')), aggfunc='count',values='var2')
窗口函数
#索引需要为日期 对于明细数据,计算固定大小区域的指标 s = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000', periods=1000)) s = s.cumsum() r = s.rolling(window=60) # window:移动窗口的大小 # min_periods:需要的非空数据点的阈值(否则结果为NA) # center:布尔值,是否将标签设置在中间(默认为False) df['数量_re'] = df['数量'].rolling('7D').sum() data1 = data.set_index('入库日期').groupby('供应商')['入库量'].rolling('7D').sum().reset_index()
标准化
# 当越小越好时 df['var_nor'] = (df['var'].max() - df['var']) / (df['var'].max() - df['var'].min()) # 当越大越好时 df['var_nor'] = (df['var'] - df['var'].min()) / (df['var'].max() - df['var'].min()) # 当中值为好是 df['var'] = np.abs(df['var']-标准值) df['var_nor'] = (df['var'].max() - df['var']) / (df['var'].max() - df['var'].min()) # 可以写成通用函数 def f2(data,col): col_name = col + '_nor' data_gp = data.groupby('类别').mean() data_gp[col_name] = (data_gp[col] - data_gp[col].min() ) / (data_gp[col].max() - data_gp[col].min() ) return data_gp
去掉异常值
def f2(data,col): q1 = data[col].quantile(q=0.25) q3 = data[col].quantile(q=0.75) iqr = q3 - q1 t1 = q1 - 3*iqr t2 = q3 + 3*iqr return data[(data[col]>t1)&(data[col]<t2)][['类别',col]]
正太分布和指数分布数据
data_norm = pd.DataFrame({'正太分布':np.random.normal(loc=60,scale=15,size=10000)}) data_exp = pd.DataFrame({'指数分布':np.random.exponential(scale=15,size=10000)+45})
随机选择
df['strategy'] = np.random.choice([1,2,3],99)
行列求和
# 增加列合计 df['合计'] = df.sum(axis=1) # 增加行合计 df.loc['合计'] = df.sum(axis=0)
数据平移
data['经度_前1天'] = data.groupby('var')['经度'].shift(1)
宽表转窄表
test = pd.DataFrame(fake_data, columns=['subject', 'A', 'B', 'C']) test subject A B C 0 math 88 70 60 1 english 90 80 78 # 转换为窄表 pd.melt(test, id_vars=['subject']) data3 = pd.melt(data2, id_vars=['var1','var2']) subject variable value 0 math A 88 1 english A 90 2 math B 70 3 english B 80 4 math C 60 5 english C 78
二维表
df.to_numpy()
改字典列表
datajs = data.to_json(orient='records',force_ascii=False) # 名称,经度,维度,数值 [{"name":"虹桥火车站","lng":121.327908,"lat":31.20033,"value":3.5225437574},{"name":"上海火车站","lng":121.46396,"lat":31.255155,"value":7.0937954904}]
转字典列表
datajs = data.to_json(orient='records',force_ascii=False) # 名称,经度,维度,数值 [{"name":"虹桥火车站","lng":121.327908,"lat":31.20033,"value":3.5225437574},{"name":"上海火车站","lng":121.46396,"lat":31.255155,"value":7.0937954904}]
两列较大值
df['z']=df[['x','y']].max(axis=1)
如果对你帮助, 欢迎点赞、关注