- 一、Pandas 数据预处理
- 1.1 控制台个性化显示设置
- 1.1.1 控制台显示所有列,换行显示
- 1.1.2 控制台显示所有行
- 1.1.3 修改pandas默认绘图引擎为plotly(需要提前安装好plotly)
- 1.1.4 还原所有显示设置
- 1.2 数据概貌
- 1.2.1 查看数据维度
- 1.2.2 查看前5条数据
- 1.2.3 查看后10条数据
- 1.2.4 随机查看8条数据
- 1.2.5 查看数据基本信息
- 1.2.6 查看 数值型 列的统计信息
- 1.3 缺失值处理
- 1.3.1 查看各列缺失值
- 1.3.2 查看缺失值合计数
- 1.3.3 查看有缺失值的列
- 1.3.4 查看有缺失值的行
- 1.3.5 删除有缺失值的行
- 1.3.6 缺失值整体填充
- 1.3.7 缺失值填充为前行同列值,可以整体或整列填充
- 1.3.8 缺失值填充为后行同列值,可以整体或整列填充
- 1.3.9 缺失值填充为同列均值,只能填充数据列
- 1.3.9 缺失值填充为上下列均值,只能填充数据列
- 1.4 重复值处理
- 1.4.1 查找完全重复的行
- 1.4.2 查找某列重复的行
- 1.4.3 删除全部重复的行,默认保留第一次出现的值
- 1.4.4 删除某列重复的行,默认保留第一次出现的值
- 1.4.5 删除重复值,保留最后一次出现的值
- 二、Pandas数据描述性分析
- 2.1 数据排序
- 2.1.1 按索引列排序
- 2.1.2 按数据列的值排序,适用于数字和字符串等类型
- 2.1.3 提取数字型数据列的n个最大值:nlargest()
- 2.1.4 提取数字型数据列最大值的索引:idxmax()
- 2.2 聚合统计
- 2.2.1 计算数字型数据列的均值:mean()
- 2.2.2 计算数字型数据列的中位数:median()
- 2.2.3 计算数字型数据列的众数:mode()
- 2.2.4 一次性统计数字型数据列的多个聚合指标:agg()
- 2.2.5 一次性统计数字型数据列的全部统计指标:describe()
- 2.2.6 分组统计平均数
- 2.2.7 分组统计多个聚合指标
- 2.2.8 统计相关系数
- 2.2.9 统计数据频数
视频讲解:
【Python百日基础系列】13 - 数据预处理与描述性分析
一、Pandas 数据预处理 1.1 控制台个性化显示设置 1.1.1 控制台显示所有列,换行显示pd.set_option('display.max_columns', None)
df = pd.read_csv('data.csv')
print(df)
1.1.2 控制台显示所有行
pd.set_option('display.max_rows', None)
df = pd.read_csv('data.csv')
print(df)
1.1.3 修改pandas默认绘图引擎为plotly(需要提前安装好plotly)
pd.set_option("plotting.backend","plotly")
1.1.4 还原所有显示设置
pd.reset_option("^display")
1.2 数据概貌
1.2.1 查看数据维度
df = pd.read_csv('data.csv')
print(df.shape)
1.2.2 查看前5条数据
df = pd.read_csv('data.csv')
print(df.head())
1.2.3 查看后10条数据
df = pd.read_csv('data.csv')
print(df.tail(10))
1.2.4 随机查看8条数据
df = pd.read_csv('data.csv')
print(df.sample(8))
1.2.5 查看数据基本信息
包括:类型、行数、列数、列名、每列非空值元素个数、每列数据类型、所有列数据类型的数量、内存占用等
df = pd.read_csv('data.csv')
print(df.info())
输出结果:
RangeIndex: 105 entries, 0 to 104
Data columns (total 52 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 positionId 105 non-null int64
1 positionName 105 non-null object
......
50 aggregatePositionIds 105 non-null object
51 famousCompany 105 non-null bool
dtypes: bool(1), float64(9), int64(16), object(26)
memory usage: 42.1+ KB
None
1.2.6 查看 数值型 列的统计信息
df = pd.read_csv('data.csv')
print(df.describe().round(2))
print(df.describe().round(2).T)
1.3 缺失值处理
1.3.1 查看各列缺失值
df = pd.read_csv('data.csv')
print(df.isna().sum())
print('----------')
print(df.isnull().sum())
1.3.2 查看缺失值合计数
df = pd.read_csv('data.csv')
print(df.isna().sum().sum())
print('----------')
print(df.isnull().sum().sum())
1.3.3 查看有缺失值的列
df = pd.read_csv('data.csv')
print(df.isna().any())
print('----------')
print(df.isnull().any())
1.3.4 查看有缺失值的行
df = pd.read_csv('data.csv')
print(df.isna().T.any())
print('----------')
print(df.isnull().T.any())
1.3.5 删除有缺失值的行
df = pd.read_csv('data.csv')
print(df.isna().T.any())
print('----------')
df.dropna(inplace=True)
print(df)
1.3.6 缺失值整体填充
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '地铁号']
print(df.isna().any())
print('----------')
print(df)
df.fillna('我是缺失值', inplace=True)
print(df)
1.3.7 缺失值填充为前行同列值,可以整体或整列填充
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
print(df.isna().any())
df.loc[[1,3], '薪资'] = np.nan
print('----------')
print(df)
# df.fillna(method='ffill', inplace=True)
df['薪资'].fillna(method='ffill', inplace=True)
print(df)
1.3.8 缺失值填充为后行同列值,可以整体或整列填充
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
print(df.isna().any())
df.loc[[1,3], '薪资'] = np.nan
print('----------')
print(df)
df.fillna(method='bfill', inplace=True)
# df['薪资'].fillna(method='bfill', inplace=True)
print(df)
1.3.9 缺失值填充为同列均值,只能填充数据列
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
print(df.isna().any())
df.loc[[1,3], '薪资'] = np.nan
print('----------')
print(df)
df['薪资'].fillna(df['薪资'].mean().round(0), inplace=True)
print(df)
1.3.9 缺失值填充为上下列均值,只能填充数据列
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
print(df.isna().any())
df.loc[[1,3], '薪资'] = np.nan
print('----------')
print(df)
df['薪资'].fillna(df['薪资'].interpolate().round(0), inplace=True)
print(df)
1.4 重复值处理
1.4.1 查找完全重复的行
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
# 查看重复值描述
print(df.duplicated().describe())
# 取出所有完全重复的行
print(df[df.duplicated()])
# 取出重复行的id
print(df[df.duplicated()]['id'].values[0])
# 根据id提取所有重复行
print(df[df['id'] == 6680900])
# 根据id提取所有重复行
print(df[df['id'] == df[df.duplicated()]['id'].values[0]])
1.4.2 查找某列重复的行
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
# 查看薪资列重复值描述
print(df.duplicated(['薪资']).describe())
# 取出薪资列重复的行
print(df[df.duplicated(['薪资'])])
# 取出薪资列重复行的id
print(df[df.duplicated(['薪资'])]['id'].values)
1.4.3 删除全部重复的行,默认保留第一次出现的值
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
# 查看全部行重复值描述
print(df.duplicated().describe())
# 删除全部重复行
df.drop_duplicates(inplace=True)
print(df)
1.4.4 删除某列重复的行,默认保留第一次出现的值
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
# 查看薪资列重复值描述
print(df.duplicated(['薪资']).describe())
# 删除薪资列重复的行
df.drop_duplicates(['薪资'], inplace=True)
print(df)
1.4.5 删除重复值,保留最后一次出现的值
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'businessZones', 'salary', 'subwayline'])
df.columns = ['id', '职位', '工作地点', '薪资', '地铁号']
# 查看薪资列重复值描述
print(df.duplicated(['薪资']).describe())
# 删除薪资列重复的行
df.drop_duplicates(['薪资'], inplace=True, keep='last')
print(df)
二、Pandas数据描述性分析
2.1 数据排序
2.1.1 按索引列排序
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'salary'])
df.columns = ['id', '职位', '薪资']
print(df)
df.set_index(['id'], inplace=True)
df.sort_index(inplace=True)
print(df)
2.1.2 按数据列的值排序,适用于数字和字符串等类型
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'salary'])
df.columns = ['id', '职位', '薪资']
print(df)
df.sort_values(by=['职位', '薪资'], ascending=False, inplace=True)
print(df.head(10))
2.1.3 提取数字型数据列的n个最大值:nlargest()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'salary'])
df.columns = ['id', '职位', '薪资']
print(df)
df.nlargest(10, '薪资')
print(df.head(10))
2.1.4 提取数字型数据列最大值的索引:idxmax()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
df.set_index(['id', '职位'], inplace=True)
print(df)
print(df.dtypes)
print(df.loc[:, '薪资':].idxmax())
2.2 聚合统计
2.2.1 计算数字型数据列的均值:mean()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.mean())
print('-------------')
print(df.薪资.mean())
print(df['薪资'].mean())
print('-------------')
print(df[['薪资', '热度', '得分']].mean())
2.2.2 计算数字型数据列的中位数:median()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.median())
print('-------------')
print(df.薪资.median())
print(df['薪资'].median())
print('-------------')
print(df[['薪资', '热度', '得分']].median())
2.2.3 计算数字型数据列的众数:mode()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.mode())
print('-------------')
print(df.薪资.mode())
print(df['薪资'].mode())
print('-------------')
print(df[['薪资', '热度', '得分']].mode())
2.2.4 一次性统计数字型数据列的多个聚合指标:agg()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.agg('mean'))
print(df[[ '薪资', '热度', '得分']].agg('mean'))
print(df[[ '薪资', '热度', '得分']].agg(['min', 'mean', 'max']))
2.2.5 一次性统计数字型数据列的全部统计指标:describe()
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.describe())
print(df[['薪资', '热度', '得分']].describe())
2.2.6 分组统计平均数
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.groupby('职位').mean())
print(df.groupby('职位')['薪资'].mean())
print(df.groupby('职位').mean()['薪资'])
print(df.groupby('职位')['薪资', '热度', '得分'].mean())
# print(df.groupby('职位').mean()['薪资', '热度', '得分']) # KeyError: ('薪资', '热度', '得分')
print(df.groupby('职位')[['薪资', '热度', '得分']].mean())
print(df.groupby('职位').mean()[['薪资', '热度', '得分']])
2.2.7 分组统计多个聚合指标
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.groupby('职位')[['薪资', '热度', '得分']].agg(['min', 'max']))
2.2.8 统计相关系数
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
print(df.corr())
print(df[['薪资', '热度', '得分']].corr())
2.2.9 统计数据频数
df = pd.read_csv('data.csv', usecols=['positionId', 'positionName', 'industryField', 'salary', 'score', 'matchScore'])
df.columns = ['id', '职位', '领域', '薪资', '热度', '得分']
df1 = df.value_counts()
df1 = df['领域'].value_counts()
df1 = df[['领域', '薪资']].value_counts()
print(df1)
print(df1.index)
print(df1.values)



