利用python进行数据分析 |数据清洗与准备

一.处理缺失值

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)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值