一.处理缺失值
1.过滤缺失值
axis=0表示删除行变量,axis=1表示删除列变量
how参数可选值为any或all,all表示删除全为NaN的行
threth为整数类型,表示删除的条件
data = pd.Series([1,NA,3.5,NA,7])
data.dropna(axis=0,how='any',threth=None)
data[data.notnull()]
2.补全缺失值
当数据中出现缺失值时,可以用其他的数值进行填充,常用的方法是fillna,语法是
fillna(value=None,method=None,axis=None,inplace=False)
其中value值除了基本类型外,还可以使用字典,实现对不同的列填充不同的值,method表示采用填充数据的方法,常用" ffill " ," bfill "
df.fillna(0)
df.fillna(method='ffill')
df.fillna(df.mean())
3.检测缺失值
pandas使用NaN表示浮点或非浮点数组中的缺失数据,python内置的None值也会被当成缺失值处理,pandas使用isnull方法检测是否为缺失值,检测对象的每一个元素返回一个bool值
data.isnull()
4.处理缺失值有三种方法
①过滤法
又称为删除法,是指当缺失的观测比例非常低时(5%以内),直接删除存在缺失的观测;或者当某变量缺失的观测比例非常高时(85%以上),直接删除这些缺失的变量
②填充法
又称为替换法,是指用某种常数直接替换那些缺失值,比如对连续值变量采用均值或者中位数替换,对于离散值变量采用众数替换
③插值法
根据其它非缺失的变量或观测来预测缺失值,常见的插值法有线性插值法,KNN插值,Lagrange插值法等
5.数据间的空格
#查看数据中的空格
df['week'].value_counts()
#去除数据中的空格
df['week'] = df['week'].map(str.strip)
df['week'] = df['week'].map(str.ltrip)
df['week'] = df['week'].map(str.rtrip)
二.数据转换
1.删除重复值
检测数据集是否重复,pandas使用duplicated方法,该方法返回的是数据行每一行的检验结果,即每一行返回一个bool值
数据表中两个条目间所有列的内容都相等时duplicated才会判断为重复值
duplicated支持从前向后(first)和从后向前(last)两种重复值查找模式
使用drop_duplicates函数后,python将返回一个只包含唯一值的数据表
#duplicated方法返回的是一个布尔值series,反映每一行是否存在重复情况
data.duplicated()
#drop_duplicates返回的是dataframe,返回数组中为false的部分
data.drop_duplicates()
2.替代值
data = pd.Series([1,999,2,999,1000,2])
data.replace(999,np.nan)
data.replace([999,1000],np.nan)
data.replace([999,1000],[np.nan,0])
3.检测和过滤异常值
指那些偏离正常范围的值,不是错误值
异常值出现频率较低,但又会对实际项目分析造成偏差
异常值一般用箱线图法(分位差法)或者分布图(标准差法)来判断
异常值往往采取盖帽法或者数据离散化
data = pd.DataFrame(np.random.randn(1000,4))
col = data[2]
col[np.abs(col) > 3]
#异常值检测之标准差法
xbar = df.price.mean()
xstd = df.price.std()
print('标准差法异常值上限检测:',any(df.price>xbar + 2.5*xstd))
print('标准差法异常值下限检测;',any(df.price<xbar - 2.5*xstd))
#异常值检测之箱线图法
Q1 = df.price.quantile(q = 0.25)
Q3 = df.price.quantile(q = 0.75)
IQR = Q3 - Q1
print('箱线图法异常值上限检测:',any(df.price > Q3 + 1.5*IQR))
print('箱线图法异常值上限检测:',any(df.price < Q1 - 1.5*IQR))
4.排序
#sort函数:从小到大进行排序
np.sort(a)
#argsort函数:返回的是数据中从小到大的索引值
np.argsort(b)
5.数据搜索
#np.where:可以自定义返回满足条件的情况
np.where(s>3,1,-1) #满足条件的,赋值为1,不满足的赋值为-1,返回的数据长度和s一样
#np.extract:返回满足条件的元素值
np.extract(s>3,s) #只输出满足条件的数据
6.日期格式
#使用to_datetime()方法将文本格式转换成日期格式
df['buy_date] = pd.to_datetime(df['day'],format='%Y%m%d',errors='coerce') #加errors防止报错
#dataframe数据类型如果是datetime64,可以使用dt方法取出年月日等
df['diff_day'].dt.days.head(3)
#对于时间差数据,可以使用timedelta函数将其转换成指定时间单位的数值
df['时间差'] = df['diff_day']/pd.Timedelta('1D')
#时间差数据,可以使用dt方法访问其常用属性
#字符串转时间
time1 = datetime.strptime(t,'%Y-%M-%D %H:%M:%S')
7.字符串
#pandas中提供了字符串的函数,但只能对字符型变量进行使用
#通过str方法访问相关属性
df['price'].str[0:4].head(3)
#可以使用字符串的相关方法进行数据处理
df['价格'] = df['price'].str.strip('$')
df['价格'] = df['价格'].str.replace(',','')
df['价格'] = df['价格'].astype(float)
df['location'].str.split(',').head(3)
df['mileage'].str.len().head(3)
8.数据统计
grouped = df.groupby('weekday')
grouped.sum()['totaltime']
grouped = df.groupby(by = ['customer','weekday'])
grouped.agg([np.mean,np.max])
df[['totaltime','food','drink']].agg([np.mean,np.sum])
9.离散化
df['price'] = pd.cut(df['price_new'],5,labels=range(5))
df['price'] = pd.qcut(df['price_new'],w,labels=range(k))
10.大小写转换
df['week'] = df['week'].map(str.upper)
df['week'] = df['week'].map(str.lower)
df['week'] = df['week'].map(str.title)
11.数据分组
df['week'] = pd.cut(df['day'],bins,labels = group_names)
12.数据分列
df = pd.DataFrame((x.split('-') for x in data1.grade),index = data1.index)