利用pandas进行数据分析(持续更新中)
- 对字段进行重命名 :
columns=({'col1':'new1',
'col2':'new2',
'col3':'new3'})
df.rename(columns=columns,inplace=True)
- 利用apply + lambda 对变量进行赋值
df['col'] = df.apply(lambda x:'a' if x.col<10 else 'b' if x.col>=10 and x.col<=20
else 'c',axis=1)
- 利用loc 进行多条件筛选:
- and用"&"表示,or用“|"表示,
- 用" isin"筛选多个值
- 用"-"实现not in筛选
df.loc[(df['col1']>=20)&(df['col2']=='a')&((df['col3']<10)|(df['col4']==30)),:]
df.loc[df['col1'].isin(['a','b','c'],:]
df.loc[-(df['col1']=='a'),:]
- 使用正则表达式进行模糊匹配
df.loc[df.col.str.contains('^35'),:] # 匹配字段为35开头的记录
df.loc[df.col.str.contains('35$'),:] # 匹配字段为35结尾的记录
以下是python中正则表达式的常用匹配规则:
- 用groupby和agg对分组后的多个字段进行不同方式的聚合:
常用的聚合函数:
计数:pd.Series.count
求和:np.sum
平均值:np.mean
最大值:np.max
最小值:np.min
df.groupby(by=['col1','col2'],as_index=False).agg({'col3':pd.Series.count,'col5':np.mean,'col6':np.sum})
- 非重复计数:
df.groupby(by='col1',as_index=False).agg({'col2':pd.Series.nunique})
df.col.nunique() #对某个字段进行非重复计数
df.nunique(axis=0) #对表中的每个字段进行非重复计数
- 用sort_values 和 reset_index对多个字段进行排序
df.sort_values(by=['col1','col2'],ascending=['False','True']).reset_index(drop=True)
- 根据某个字段筛选前n条记录,后n条记录
df.nlargest(n,columns=['col'])
df.nsmallest(n,columns=['col'])
- 分组之后的筛选每组前n条记录:
df.assign(rn=df.groupby('col1').col2.rank(method='first',ascending=False)).\
query('rn<=3').sort_values(['col1','rn']).reset_index().loc[:,['col1','col2','rn']]
- 对某列排序后并编号,相当于给出排序名次:
df['rank']= df['col'].rank(method='first',ascending=False).apply(lambda x:int(x))
df.sort_values(by='rank',ascending=True)
- 对一个字段中的值进行替换操作:
df.replace({'col':{'a':'A','b':'B','c':'C'}},inplace=True)
- 离差标准化:
def max_min_scale(data):
data = (data-data.min())/(data.max()-data.min())
return data
df['离差标准化']=max_min_scale(df['col'])
- 标准差标准化:
def standrad_scale(data):
data = (data-data.mean())/data.std()
return data
df['标准差标准化'] = standrad_scale(df['col'])
- 小数定标准化:
def decimal_scale(data):
data = data/10**np.ceil(np.log10(data.abs().max()))
return data
df['小数定标准化'] = decimal_scale(df['col'])
- 亚编码处理:
df_dummies = pd.get_dummies(df['col'],prefix=None,prefix_sep='_',columns=None)
df = pd.concat([df,df_dummies],axis=1,join='outer')
- 导入必要的包并进行参数设置:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
import seaborn as sns
sns.set(style='ticks',palette='muted',font_scale=1.5,font='ETBembo',rc={'figure.figsize':(8,4)})
# sns 的style有'dark','white','darkgrid','whitegrid','ticks'五种设置,
# palette有'muted','deep','pastel','bright','dark','colorblind'
import warnings
warnings.filterwarnings('ignore') #去除弹出的warnings
pd.set_option('precision',5) #设置精度
pd.set_option('display.float_format', lambda x: '%.3f' % x) #不显示科学计数法,设置小数位为3
pd.options.display.max_rows=200 #最多显示200行
- 查看变量类型
df.dtypes #每个字段的类型
set(df.dtypes) #数据集包含哪几种数据类型
df.select_dtypes(include=['float64']).columns #查看每种类型对应的字段
- 对分类型变量作描述分析
df.select_dtypes(include=['0']).describe().T\
.assign(missing_pct=df.apply(lambda x: (len(x)-x.count())/len(x)))
# 对于object类型describe会给出非空值数量、unique数量、最大频数变量、最大频数
- 对连续型变量作描述分析
(df.select_dtypes(include=['int64','float64']).describe().T)\
.drop(['25%','50%','75%'],axis=1)\
.assign(missing_pct = df.apply(lambda x: (len(x)-x.count())/len(x)),