缺失值观察和处理
查看空值个数
data.info()
data.isnull().sum()
缺失值处理
#检索空值
data[data['Age'].isna()] = 0
data[data['Age'].isnull()] = 0 #推荐
data[data['Age'] == None] = 0
data[data['Age'] == np.nan] = 0 #采用比较时候,不要使用none,有的检索不出来
# dropna()函数删除有空值的行和列,,thresh决定空值的个数
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
df.dropna(how='all') #how决定删除依据是只要有空值还是所有值都为空,all代表都为空才删除
df.dropna(thresh=2) #删除操作需要达到的空值个数
df.dropna(subset=['name', 'toy']) #删除 name toy列含有空值的行
# 填充空值
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)[source]
df.fillna(method="ffill") # method{‘backfill’, ‘ffill’, None}, default None 向前向后传播临近的非空值
values = {"A": 0, "B": 1, "C": 2, "D": 3}
df.fillna(value=values) # 使用字典填充指定列的空值
df.fillna(value=values, limit=1) # limit 存在多个空值,决定填充空值的个数
df2 = pd.DataFrame(np.zeros((4, 4)), columns=list("ABCE"))
df.fillna(df2) #使用dataframe格式填充空值,只有相同列明的空值才会被填充
重复值观察和处理
# duplicated 重复值检测,keep一般保持为默认first,第一次出现的记录为false,第二次及以后出现为ture,返回布尔值的series
duplicated(subset=None, keep='first')[source]
df.duplicated()
df.duplicated(subset=['brand'])# 指定列检测
df.duplicated().sum() #计算重复个数
data[data.duplicated()] #返回重复的数据
#drop_duplicates删除重复行,keep保持默认first,重复值保留第一次出现的记录
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
特征值观察于处理
连续型变量离散化处理(分箱)
#pd.cut()函数,可以等宽,可以指定区间分割,
pandas.cut(x, bins, right=True, labels=None, precision=3)
data['年龄分组']= pd.cut(data['Age'],5,labels =[1,2,3,4,5])#均分箱成5个年龄段,并分别用类别变量12345表示
pd.cut(data['Age'],[0,5,15,30,50,80],right = False,labels =[1,2,3,4,5]) #划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
#qcut()按频率分
pd.qcut(data['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels =[1,2,3,4,5])# 按10% 30% 50% 70% 90%五个年龄段,并用分类变量12345表示
对文本变量进行转换
#查看文本变量名及种类
data['Sex'].value_counts()# 返回每种名称和数量
data['Sex'].unique() #返回种类名称
data['Sex'].nunique() #只返回种类的数量
#种类较少的可以使用replace map函数进行替换
data['sex_num'] = data['Sex'].map({'male':1,'female':2}) #没有匹配上的会赋值为空
data['sex_num'] = data['Sex'].replace(['male', 'female'],[1,2]) #没有对应的保持原值
#使用sklearn的labelencoder
from sklearn.preprocessing import LabelEncoder
data['Cabin'] = LabelEncoder().fit_transform(data['Cabin'])
#onehot编码
x = pd.get_dummies(data['Embarked'], prefix='Embarked') # prefix 前缀
data = pd.concat([data,x],axis =1)# 编码后的和源数据按照列拼接
数据重构1
数据链接
# 默认纵向连接行,axis=1 则横向链接列
result_up = pd.concat(list_up,axis=1)
#横向链接列
resul_up = text_left_up.join(text_right_up)
result_up = pd.merge(text_left_up,text_right_up,left_index=True,right_index=True) #要有共同列或者使用索引left—_index =true;默认内连接
#纵向链接行
result = resul_up.append(result_down)
数据重构
#吧dataframe格式数据转为series类型 level 控制列轴到行显示的索引级别
DataFrame.stack(level=- 1, dropna=True)[source]
聚合函数
# data数据按照性别聚合,分别计算票价均值和仓位总和
data.groupby('Sex').agg({'Fare': 'mean', 'Pclass': 'count'}).rename(columns=
{'Fare': 'mean_fare', 'Pclass': 'count_pclass'})
data['Survived'].groupby(data['Sex']).sum()
数据可视化
pandas.DataFrame.plot()
import matplotlib.pyplot as plt
#柱状图
survived.plot.bar()
data.groupby(by = ['Pclass'])['Survived'].value_counts().unstack().plot(kind='bar',stacked = 'true')
#折线图
far=data.groupby(by = ['Fare'])['Survived'].value_counts().sort_values(ascending=False)
fig = plt.figure(figsize=(20, 20))
far.plot(grid= 'Ture')
plt.legend()
plt.show()
#直方图
data.Age[data['Survived'] == 0].hist(bins =5,alpha = 0.5)
data.Age[data['Survived'] == 1].hist(bins =5,alpha = 0.5)
plt.legend((0,1))
plt.xlabel('age')
plt.ylabel('count')
#密度分布图
data.Age[data['Survived'] == 0].plot.density()
data.Age[data['Survived'] == 1].plot.density()