python数据挖掘分析流程及代码

数据预处理

1.数据去重

import pandas as pd # 导入pandas库
 
# 生成重复数据
data1 = ['a', 3]
data2 = ['b', 2]
data3 = ['a', 3]
data4 = ['c', 2]
df = pd.DataFrame([data1, data2, data3, data4], columns=['col1',
'col2'])
print (df)
 
# 判断重复数据
isDuplicated = df.duplicated() # 判断重复数据记录
print (isDuplicated) # 打印输出
 
# 删除重复值
new_df1 = df.drop_duplicates() # 删除数据记录中所有列值相同的记录
new_df2 = df.drop_duplicates(['col1']) # 删除数据记录中col1值相同的记录
new_df3 = df.drop_duplicates(['col2']) # 删除数据记录中col2值相同的记录
new_df4 = df.drop_duplicates(['col1', 'col2']) # 删除数据记录中指定列(col1/col2)值相同的记录
print (new_df1) # 打印输出
print (new_df2) # 打印输出
print (new_df3) # 打印输出
print (new_df4) # 打印输出

2.缺失值处理

对于缺失值的处理上,主要配合使用sklearn.preprocessing中的Imputer类、Pandas和Numpy。其中由于Pandas对于数据探索、分析和探查的支持较为良好,因此围绕Pandas的缺失值处理较为常用。

import pandas as pd # 导入pandas库
import numpy as np # 导入numpy库
from sklearn.preprocessing import Imputer # 导入sklearn.preprocessing中的Imputer库
 
# 生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2','col3', 'col4']) # 生成一份数据
df.iloc[1:2, 1] = np.nan # 增加缺失值
df.iloc[4, 3] = np.nan # 增加缺失值
print (df)
 
# 查看哪些值缺失
nan_all = df.isnull() # 获得所有数据框中的N值
print (nan_all) # 打印输出
# 查看哪些列缺失
nan_col1 = df.isnull().any() # 获得含有NA的列
nan_col2 = df.isnull().all() # 获得全部为NA的列
print (nan_col1) # 打印输出
print (nan_col2) # 打印输出
 
# 丢弃缺失值
df2 = df.dropna() # 直接丢弃含有NA的行记录
print (df2) # 打印输出
 
# 使用sklearn将缺失值替换为特定值
nan_model = Imputer(missing_values='NaN', strategy='mean',axis=0) # 建立替换规则:将值为Nan的缺失值以均值做替换
nan_result = nan_model.fit_transform(df) # 应用模型规则
print (nan_result) # 打印输出
 
# 使用pandas将缺失值替换为特定值
nan_result_pd1 = df.fillna(method='backfill') # 用后面的值替换缺失值
nan_result_pd2 = df.fillna(method='bfill', limit=1) # 用后面的值替代缺失值,限制每列只能替代一个缺失值
nan_result_pd3 = df.fillna(method='pad') # 用前面的值替换缺失值
nan_result_pd4 = df.fillna(0) # 用0替换缺失值
nan_result_pd5 = df.fillna({'col2': 1.1, 'col4': 1.2}) # 用不同值替换不同列的缺失值
nan_result_pd6 = df.fillna(df.mean()['col2':'col4']) # 用平均数代替,选择各自列的均值替换缺失值
# 打印输出
print (nan_result_pd1) # 打印输出
print (nan_result_pd2) # 打印输出
print (nan_result_pd3) # 打印输出
print (nan_result_pd4) # 打印输出
print (nan_result_pd5) # 打印输出
print (nan_result_pd6) # 打印输出
airline_data = pd.read_csv('air_data.csv', encoding='gb18030')  # 以指定格式读取数据
print('原始数据的尺寸为:',airline_data.shape)

'''
丢弃票价为空的记录
'''
exp1 = airline_data['SUM_YR_1'].notnull()
exp2 = airline_data['SUM_YR_2'].notnull()
airline_notnull = airline_data[exp1 & exp2]
print('删除缺失记录后数据的尺寸为:',airline_notnull.shape)

 

pd.isnull(t3)
pd.notnull(t3)
t3.[pd.notnull(t3['w'])]
t3.dropna(axis=0,how="any")
t3.dropna(axis=0,how="all")# 全为空值
t3.dropna(axis=0,how='any',inplace=True)
t2['age']=t2['age'].fillna(t2['age'].mean())
t2['age'][1]=np.nan

3.异常值处理

有关异常值的确定有很多规则和方法,这里使用Z标准化得到的阀值作为判断标准:当标准化后的得分超过阀值则为异常。完整代码如下:

但一般根据实际情况进行分析处理:

import pandas as pd # 导入pandas库
 
# 生成异常数据
df = pd.DataFrame({'col1': [1, 120, 3, 5, 2, 12, 13],'col2':[12, 17, 31, 53, 22, 32, 43]})
print (df) # 打印输出
 
# 通过Z-Score方法判断异常值
df_zscore = df.copy() # 复制一个用来存储Z-score得分的数据框
cols = df.columns # 获得数据框的列名
for col in cols: # 循环读取每列
df_col = df[col] # 得到每列的值
z_score = (df_col - df_col.mean()) / df_col.std() # 计算每列的Z-score得分
df_zscore[col] = z_score.abs() > 2.2 # 判断Z-score得分是否大于2.2,如果是则是True,否则为False
print (df_zscore) # 打印输出
'''
丢弃票价为0,平均折扣率不为0,总飞行公里数大于0的记录
'''
index1 = airline_notnull['SUM_YR_1'] == 0
index2 = airline_notnull['SUM_YR_1'] == 0
index3 = airline_notnull['avg_discount'] != 0
index4 = airline_notnull['SEG_KM_SUM'] > 0
airline = airline_notnull[-(index1&index2&index3&index4)]#按条件删除数据
print('删除异常记录后数据的尺寸为:',airline.shape)

"""
处理时间数据
"""
airline_selection = airline.loc[:,['FFP_DATE','LOAD_TIME','FLIGHT_COUNT','LAST_TO_END','avg_discount','SEG_KM_SUM']]
L = pd.to_datetime(airline_selection['LOAD_TIME'])-pd.to_datetime(airline_selection['FFP_DATE'])
L = L.astype('str').str.split().str[0]
L = L.astype('int')/30

python Dataframe按条件删除某行,删除某列

.删除df.ts_code大于等于"500000"且小于"600000"的所有行
     df = df.drop(df[(df.ts_code >= "500000") & (df.ts_code < "600000")].index)
2.删除exchange_id列
     df = df.drop('exchange_id', axis=1)

 

4.DataFrame常用操作

"""
//标准化
data_mean = data_train.mean()
data_std = data_train.std()
data_train = (data_train - data_mean)/data_std  
"""

"""
dataframe操作
"""
"""
data=airline_data.copy()
data.shape
data.dtypes
data.index
data.columns
data.values
data.head(3)
data.describe()
"""

5.数据筛选

df[(df['Row_Labels'].str.len()>4)&(df["Count"]>700)]

6.数据修改

python dataframe选择满足某条件的行,进行操作

数据如上图所示,现找出state中'state'列中含有字符'io'的行,将其的debt列赋值为'aa',实现代码如下:

frame.ix[frame['state'].str.contains('io'),['debt']] = 'aa'
frame

现找出state中'state'列中等于‘Ohio’行,将其的debt列赋值为'aa',frame还是开头定义的,实现代码如下:

frame.ix[frame['state']=='Ohio',['debt']] = 'aa'
frame

多个选择条件时,用(‘&’、‘|’),如现找出state中'state'列中等于‘Ohio’行或者‘Merry’的行,用'|',将其的debt列赋值为'aa',实现代码如下

frame.ix[(frame['state']=='Ohio')|(frame['state']=='Merry'),['debt']] = 'aa'
frame

 7.数据筛选

https://blog.csdn.net/weixin_43689776/article/details/84395845

8.分组聚合

https://blog.csdn.net/brucewong0516/article/details/78768443

https://blog.csdn.net/weixin_37536446/article/details/82109431

https://blog.csdn.net/BF02jgtRS00XKtCx/article/details/103951771    //函数齐全

https://blog.csdn.net/weixin_42782150/article/details/90716533    //分组遍历讲的好

https://blog.csdn.net/u014252563/article/details/70835271      //DataFrame执行groupby聚合操作后,如何继续保持DataFrame对象而不变成Series对象

https://blog.csdn.net/weixin_43656359/article/details/104428030    //函数方法查表

9.筛选日期

7.3 
# 라이브러리를 임포트합니다.
import pandas as pd
​
# 데이터프레임을 만듭니다.
dataframe = pd.DataFrame()
​
# 创建datetime
dataframe['date'] = pd.date_range('1/1/2001', periods=100000, freq='H')
dataframe
# 두 datetime 사이의 샘플을 선택합니다.  筛选日期
dataframe[(dataframe['date'] > '2002-1-1 01:00:00') &
          (dataframe['date'] <= '2002-1-1 04:00:00')]
date
8762	2002-01-01 02:00:00
8763	2002-01-01 03:00:00
8764	2002-01-01 04:00:00
筛选日期
# 设置索引
dataframe = dataframe.set_index(dataframe['date'])
​
#筛选日期
dataframe.loc['2002-1-1 01:00:00':'2002-1-1 04:00:00']
date
date	
2002-01-01 01:00:00	2002-01-01 01:00:00
2002-01-01 02:00:00	2002-01-01 02:00:00
2002-01-01 03:00:00	2002-01-01 03:00:00
2002-01-01 04:00:00	2002-01-01 04:00:00

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值