快速生成描述性报告
pandas_profiling需要安装(失败)
import pandas_profiling as pp
pp.ProfileReport(data)
查看变量基本信息
data.describe()
查看数据行列数
train_data.shape , test_data.shape
查看数据个数
ntr = len(train_data)
查看数据分类名称 unique()
data['护理来源'].unique()
数据分类计数 value_counts()
data['out'].value_counts()
新增列并赋值
# 新增因变量列,赋值缺失值,合并前区分数据集
test_data['肝炎'] = 'nan'
获取列名、合并数据集
# 列名列表
dcols = list(train_data.columns)
# 按同一列名合并,重置行标签
d0 = pd.concat([train_data[dcols],test_data[dcols]]).reset_index(drop=True)
删除无用列变量
d0.drop('ID',axis= 1,inplace=True)
分类变量编码
### 硬编码(树形模型适用)
from sklearn.preprocessing import LabelEncoder
x['区域'] = LabelEncoder().fit_transform(x['区域'])
### 哑变量(使用回归时)(自动识别分类变量)
d0 = pd.get_dummies(d0)
### 自己编码
## 对性别进行编码
def gender(x):
if x=='M':
return 0
else:
return 1
d0['性别']=d0['性别'].apply(gender)
## 对区域进行编码
def district(x):
if x=='east':
return 1
elif x=='south':
return 2
elif x=='north':
return 3
else:
return 4
d0['区域']=d0['区域'].apply(district)
## 对护理来源进行编码
def care(x):
if x=='Governament Hospital':
return 1
if x=='Never Counsulted':
return 2
if x=='Private Hospital' or x==' ':
return 3
if x=='clinic':
return 4
d0['护理来源']=d0['护理来源'].apply(care)
随机抽取random.sample 、集合的差集set.difference
多用于截取列表的指定长度的随机数,但是不会改变列表本身的排序
list = [0,1,2,3,4]
rs = random.sample(list, 2)
print(rs)
》》》[2, 4]
随机抽取股票代码,构建训练集,测试集的股票id
random.seed(1) # “1” 确定随机结果
tr_ids = random.sample(list(stock_codes),int(len(stock_codes)*0.7))
te_ids = list(set.difference(set(stock_codes),set(tr_ids))) # set.difference 集合的差集
数据归一化
0-1之间
https://www.zhangshengrong.com/p/x7XR8lvdaz/
X = (X-X.min())/(X.max()-X.min())
标准化
https://blog.youkuaiyun.com/sinat_26917383/article/details/51228217
# 对数据进行标准化
X = (X - X.mean())/np.std(X)
缺失值的处理
泰坦尼克号例子
https://blog.youkuaiyun.com/weixin_33734785/article/details/94638607
查看所有列缺失值情况:== data.info()==
isnull、notnull:判断缺失值
dropna:删除缺失值
fillna、interpolate:填补缺失值
data.count(axis=0) 统计每列的非空值个数
data.count(axis=1) 统计每行的非空值个数
df.shape[0] - df.count() 缺失值总个数
data = pd.Series([1,2,3,np.nan,np.nan,4,5])
# 判断缺失值
data.isnull()
data.notnull()
# 通过 sum 和 isnull 函数来检测有多少缺失值
sum(data.isnull())
data.isnull().sum()
# 筛选出所有含有缺失值的行
df[df.isna().T.any()]
## 删除缺失值
# 通过 dropna 直接删除缺失值,默认情况下 dropna 会删除任何含有缺失值的行
data.dropna()
# 指定列,删除行数据(2种方法)
train.dropna(subset=['肝炎'], how='all', inplace=True)
train_data = train_data[train_data['肝炎'].isnull()==False]
## 填补缺失值
#采用前项填充或者后项填充
data.fillna(method = 'ffill')
data.fillna(method = 'bfill')
# 使用常量填充
data.fillna(100)
# 均值、中位数、众数
data.fillna(data.mean())
data.fillna(data.median())
data['体重'] = data['体重'].fillna(data['体重'].median())
data['教育'] = data['教育'].fillna(data['教育'].mode()[0])
条件填充缺失值
### 1个条件
data['高血压'][data['最高血压']>140]=1
data['高血压'][data['最高血压']<=140]=0
### 2个条件
d0['最高血压'][d0['最高血压'].isnull() & d0['高血压']==1] = 141
d0['最高血压'][d0['最高血压'].isnull() & d0['高血压']==0] = 119
d0['最低血压'][d0['最低血压'].isnull()] = 70
### 3个条件(循环)
for i in range(len(d0)):
# 高血压缺失填补
if np.isnan(d0.loc[i,'高血压']):
if d0.loc[i,'最高血压']>=140:
d0.loc[i,'高血压'] = 1
else:
d0.loc[i,'高血压'] = 0
# 高血压异常调整
if d0.loc[i,'最高血压'] <140 and d0.loc[i,'高血压'] ==1:
d0.loc[i,'高血压'] = 0
if d0.loc[i,'最高血压'] >=140 and d0.loc[i,'高血压'] ==0:
d0.loc[i,'高血压'] = 1
# 肥胖腰围异常调整
if d0.loc[i,'肥胖腰围']==1 and np.isnan(d0.loc[i,'腰围']):
d0.loc[i,'腰围'] = 110
if d0.loc[i,'肥胖腰围']==0 and np.isnan(d0.loc[i,'腰围']):
d0.loc[i,'腰围'] = 90
### 交叉分段填充
# 年龄分段求最高血压均值
d0.describe()
for i in range(len(d0)):
if d0.loc[i,'年龄']<40 :
d0.loc[i,'年龄段'] = '20-40'
if 40<=d0.loc[i,'年龄']<60 :
d0.loc[i,'年龄段'] = '40-60'
if 60<=d0.loc[i,'年龄']<80 :
d0.loc[i,'年龄段'] = '60-80'
if d0.loc[i,'年龄']>=80 :
d0.loc[i,'年龄段'] = '80-100'
d0[['年龄段', '最高血压']].groupby('年龄段',as_index=False).mean()
# 按年龄填充
import numpy as np
for i in range(len(d0)):
if np.isnan(d0.loc[i,'最高血压']):
if d0.loc[i,'年龄']<40:
d0.loc[i,'最高血压'] = 113.517898
if 40<=d0.loc[i,'年龄']<60:
d0.loc[i,'最高血压'] = 124.015680
if 60<=d0.loc[i,'年龄']<80:
d0.loc[i,'最高血压'] = 138.441622
if d0.loc[i,'年龄']>=80:
d0.loc[i,'最高血压'] = 147.539200
重复数据处理
# 生成数据
data1,data2,data3,data4=['a',3],['b',2],['a',3],['c',2]
df=pd.DataFrame([data1,data2,data3,data4],columns=['col1','col2'])
print(df)
## 判断重复数据
df.duplicated()
## 删除重复的数据
# 删除所有列值相同的记录
df.drop_duplicates()
# 删除指定列值相同的记录
df.drop_duplicates(['col2'])
异常值处理
data = pd.DataFrame(np.random.randn(1000,4))
data.head()
# 通过describe可以看到最大值有大于3的,最少值有小于负3的,那么这里假设大于3的和小于负3的都属于异常值,需要让它们都分别变成3和-3
data.describe()
# 假设想要找出一列中绝对值大于3的值
data[2][np.abs(data[2])>3]
# 选出所有值大于3或小于3的行
data[(np.abs(data)>3).any(1)]
# 将小于-3的值换成-3,大于3的值换成3
data[np.abs(data) > 3] = np.sign(data) * 3
data.describe()
# np.sign(data)是根据数据中的值的正负分别生成1和-1的数值
np.sign(data).head()
某列根据另一列条件赋值
data['高血压'][data['最高血压']>140]=1
data['高血压'][data['最高血压']<=140]=0
列表里面删除 ‘None’
a = [ '','None', 1,2,3]
a
b = [str for str in a if str not in [ '', 'None']]
b
[ ’ ‘,’ None’, 1, 2, 3]
[1, 2, 3]