> 技术文档 > Pandas库使用教学(基础数据类型Series、DataFrame,利用pandas进行数据处理、数据分析)

Pandas库使用教学(基础数据类型Series、DataFrame,利用pandas进行数据处理、数据分析)


Pandas库使用教学(基础数据类型Series、DataFrame,利用pandas进行数据处理、数据分析)

此文章共三节:

1. 基础数据类型

2. 利用pandas进行数据处理

3. 利用Pandas进行数据分析

Pandas基础数据类型

Pandas 是 Python 中用于数据处理和分析的强大库,它提供了两种主要的数据类型:SeriesDataFrame。下面将详细介绍这两种数据类型的创建、属性和基本操作。

1. Series

Series是一维带标签的数组,它可以保存任何数据类型(整数、字符串、浮点数等)。每个元素都有一个与之关联的标签,称为索引。

创建 Series

可以使用列表、字典等方式创建Series

import pandas as pd# 使用列表创建Series(默认索引)s_1 = pd.Series([1, 2, 3, 4, 5])print(\"使用列表创建的Series(默认索引):\")print(s_1)# 使用列表创建Series(自定义索引)s_2 = pd.Series([1, 2, 3, 4, 5], index=[\'a\', \'b\', \'c\', \'d\', \'e\'])print(\"\\n使用列表创建的Series(自定义索引):\")print(s_2)# 使用字典创建Seriesdic_1 = {\"name1\": \"Peter\", \"name2\": \"tin\", \"name3\": \"rose\"}s_3 = pd.Series(dic_1)print(\"\\n使用字典创建的Series:\")print(s_3)# 使用标量值创建Seriess_4 = pd.Series(10, index=[\'x\', \'y\', \'z\'])print(\"\\n使用标量值创建的Series:\")print(s_4)
Series 的属性
  • index:获取索引。
  • values:获取值。
  • dtype:获取数据类型。
print(\"\\nSeries的索引:\")print(s_1.index)print(s_2.index)print(\"\\nSeries的值:\")print(s_1.values)print(s_3.values)print(\"\\nSeries的数据类型:\")print(s_1.dtype)print(s_3.dtype)
Series 的基本操作
  • 查询:可以通过索引访问单个或多个元素。
# 访问单个元素print(\"\\n访问单个元素:\")print(s_2[\'d\'])# 访问多个元素(切片)print(\"\\n访问多个元素(切片):\")print(s_2[\'a\':\'d\'])# 访问多个元素(指定索引列表)print(\"\\n访问多个元素(指定索引列表):\")print(s_2[[\'a\', \'d\']])# 使用布尔索引查询print(\"\\n使用布尔索引查询:\")print(s_1[s_1 > 3])
  • 删除:使用drop方法删除指定索引的元素。
s_2 = s_2.drop(\'a\')print(\"\\n删除元素后的Series:\")print(s_2)
  • 修改:可以直接通过索引修改元素的值。
s_3[0] = \'Tom\'print(\"\\n修改元素后的Series:\")print(s_3)s_3 = s_3.replace(\'Tom\', \'Jerry\')print(\"\\n替换元素后的Series:\")print(s_3)
  • 算术运算:可以对 Series 进行算术运算。
s_5 = pd.Series([1, 2, 3], index=[\'a\', \'b\', \'c\'])s_6 = pd.Series([4, 5, 6], index=[\'a\', \'b\', \'c\'])print(\"\\nSeries相加:\")print(s_5 + s_6)

2. DataFrame

DataFrame是二维带标签的数据结构,类似于电子表格或 SQL 表。它由行索引和列索引组成,每列可以是不同的数据类型。

创建 DataFrame

可以使用字典、二维数组等方式创建DataFrame

# 使用字典创建DataFramedic = {\'name\': [\'kiti\', \'beta\', \'peter\', \'tom\'], \'age\': [20, 18, 35, 21], \'gender\': [\'f\', \'f\', \'m\', \'m\']}df = pd.DataFrame(dic)print(\"\\n使用字典创建的DataFrame:\")print(df)import numpy as npimport pandas as pd# 使用二维数组创建DataFramedatas = pd.date_range(\'20180101\', periods=5)df1 = pd.DataFrame(np.arange(30).reshape(5, 6), index=datas, columns=[\'A\', \'B\', \'C\', \'D\', \'E\', \'F\'])print(\"\\n使用二维数组创建的DataFrame:\")print(df1)# 使用Series创建DataFrames_name = pd.Series([\'kiti\', \'beta\', \'peter\', \'tom\'])s_age = pd.Series([20, 18, 35, 21])df2 = pd.DataFrame({\'name\': s_name, \'age\': s_age})print(\"\\n使用Series创建的DataFrame:\")print(df2)
DataFrame 的属性
  • index:获取行索引。
  • columns:获取列索引。
  • values:获取数据值。
  • shape:获取数据框的形状(行数和列数)。
print(\"\\nDataFrame的行索引:\")print(df.index)print(\"\\nDataFrame的列索引:\")print(df.columns)print(\"\\nDataFrame的值:\")print(df.values)print(\"\\nDataFrame的形状:\")print(df.shape)
DataFrame 的基本操作
  • 修改列名和行名:可以直接赋值修改。
# 修改列名df.columns = [\'Name\', \'Age\', \'Gender\']print(\"\\n修改列名后的DataFrame:\")print(df)# 修改行名df.index = range(1, len(df) + 1)print(\"\\n修改行名后的DataFrame:\")print(df)
  • 增加列和行:可以直接赋值增加列,使用loc方法增加行。
# 增加列df[\'Score\'] = [80, 90, 75, 85]print(\"\\n增加列后的DataFrame:\")print(df)# 增加行df.loc[5] = [\'jack\', 22, \'m\', 92]print(\"\\n增加行后的DataFrame:\")print(df)
  • 查询:可以使用loc(标签索引)和iloc(位置索引)方法进行查询。
# 使用loc方法查询print(\"\\n使用loc方法查询某个值:\")print(df.loc[1, \'Name\'])print(\"\\n使用loc方法查询某列值:\")print(df.loc[:, \'Age\'])print(\"\\n使用loc方法查询某些行:\")print(df.loc[1:3, :])# 使用iloc方法查询print(\"\\n使用iloc方法查询某个值:\")print(df.iloc[0, 1])print(\"\\n使用iloc方法查询某列值:\")print(df.iloc[:, 2])print(\"\\n使用iloc方法查询某些行:\")print(df.iloc[0:2, :])
  • 删除:可以使用del关键字或drop方法删除列和行。
# 删除列del df[\'Score\']print(\"\\n删除列后的DataFrame:\")print(df)# 删除行df = df.drop(5)print(\"\\n删除行后的DataFrame:\")print(df)
  • 排序:可以使用sort_values方法对数据框进行排序。
# 按年龄升序排序df = df.sort_values(by=[\'Age\'])print(\"\\n按年龄升序排序后的DataFrame:\")print(df)# 按年龄降序排序df = df.sort_values(by=[\'Age\'], ascending=False)print(\"\\n按年龄降序排序后的DataFrame:\")print(df)
  • 值替换:可以使用replace方法替换数据框中的值。
df[\'Gender\'] = df[\'Gender\'].replace([\'m\', \'f\'], [\'male\', \'female\'])print(\"\\n值替换后的DataFrame:\")print(df)

通过以上内容,你应该对 Pandas 的两种基础数据类型SeriesDataFrame有了较为全面的了解。

接下来我们将学习   ”使用pandas数据处理“  以及  “利用Pandas进行数据分析”

利用 Pandas 进行数据处理教学

一、引言

Pandas 是 Python 中一个强大的数据处理和分析库,它提供了丰富的数据结构和函数,能够高效地处理和分析各种类型的数据。本教学将结合之前代码库中的示例,详细介绍 Pandas 在数据处理中的常见操作。

二、数据导入

在进行数据处理之前,首先需要将数据导入到 Python 环境中。Pandas 支持多种数据格式的导入,以下是几种常见的导入方式:

1. 导入 CSV 文件
import pandas as pd# 导入 CSV 文件df_1 = pd.read_csv(\"data1.csv\")# 如果文件存在编码问题,可以指定编码和引擎df_2 = pd.read_csv(\"data2.csv\", encoding=\'utf8\', engine=\'python\', header=None)
2. 导入 Excel 文件
# 导入 Excel 文件df_3 = pd.read_excel(\"data3.xlsx\")
3. 导入 TXT 文件
# 导入 TXT 文件,指定分隔符和表头df_4 = pd.read_table(\"data4.txt\", sep=\',\', header=None)

三、缺失值处理

在实际数据中,经常会存在缺失值的情况。Pandas 提供了多种处理缺失值的方法,包括数据补齐、删除对应数据行等。

# 导入包含缺失值的数据df = pd.read_csv(r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\2.缺失值处理\\data.csv\",  encoding=\'gbk\', engine=\'python\')# 进行逻辑判断,判定空值所在的位置na = df.isnull()# 找出空值所在的行数据df[na.any(axis=1)]# 找出空值所在的列数据df[na[[\'gender\']].any(axis=1)]# 填充缺失值df1 = df.fillna(\'1\')# 删除缺失值(删除整行数据)df2 = df.dropna()

四、重复值处理

重复值可能会影响数据分析的结果,因此需要对其进行处理。Pandas 提供了查找和删除重复值的方法。

# 导入数据df = pd.read_csv(r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\3.重复值处理\\data1.csv\",  encoding=\'gbk\', engine=\'python\')# 找出重复值的位置result1 = df.duplicated()# 根据列名来判断重复result2 = df.duplicated(\'gender\')result3 = df.duplicated([\'gender\', \'name\'])# 提取重复的行df[result1]# 删除重复的行# 完全重复new_df1 = df.drop_duplicates()# 部分重复(根据某列名来删除)new_df2 = df.drop_duplicates([\'name\', \'gender\'])

五、数据抽取

根据一定条件抽取数据是数据处理中常见的操作。Pandas 支持比较运算、字符匹配和逻辑运算来进行数据抽取。

# 导入数据df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\5.数据抽取\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 比较运算# 抽取好评数大于 17000 的电脑df[df[\'好评数\'] > 17000]# 抽取好评数在 15000 到 17000 之间的电脑df[df[\'好评数\'].between(15000, 17000)]# 字符匹配df[df[\'品牌\'].str.contains(\'苹果\', na=False)]# 逻辑运算# 取出价格小于 7000,好评大于 16000 的电脑df[(df[\'价格\']  16000)]

六、数据框的合并

在数据分析中,有时需要将多个数据框合并成一个。Pandas 提供了 concat() 函数来实现数据框的合并。

import numpy as np# 创建数据框df_1 = pd.DataFrame(np.arange(12).reshape(3, 4))df_2 = 2 * df_1# 竖向合并new_df1 = pd.concat([df_2, df_1])# 横向合并new_df2 = pd.concat([df_1, df_2], axis=1)# 使用 join 参数df_3 = pd.DataFrame(np.arange(12).reshape(3, 4),  index=[\'A\', \'B\', 2])new_df3 = pd.concat([df_1, df_3], axis=1, join=\'inner\')new_df4 = pd.concat([df_1, df_3], axis=1, join=\'outer\')

七、合并数据框的列

可以使用 + 运算符将数据框的列进行拼接。

# 导入数据df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\7.合并数据框的列\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 合并列num = df[\'area\'] + df[\'birthday\'] + df[\'ranking\'] + df[\'only\']df[\'id\'] = num

八、merge() 函数

merge() 函数用于拼接两个数据框。

# 导入数据df_1 = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\8.merge函数\\data1.csv\", encoding=\'gbk\', engine=\'python\')df_2 = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\8.merge函数\\data2.csv\", encoding=\'gbk\', engine=\'python\')# 根据 name 将两个数据框连接起来,删除各自数据框独有的信息df_3 = pd.merge(df_1, df_2, left_on=\'name\', right_on=\'name\')# 根据 name 将两个数据框连接起来,保留左边的信息df_4 = pd.merge(df_1, df_2, left_on=\'name\', right_on=\'name\', how=\'left\')# 根据 name 将两个数据框连接起来,保留右边的信息df_5 = pd.merge(df_1, df_2, left_on=\'name\', right_on=\'name\', how=\'right\')# 根据 name 将两个数据框连接起来,全部保留df_6 = pd.merge(df_1, df_2, left_on=\'name\', right_on=\'name\', how=\'outer\')

九、计算

在数据处理中,经常需要进行一些计算操作,例如计算总价。

# 导入数据df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\9.计算\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 计算总价df[\'总价\'] = df[\'单价\'] * df[\'数量\']

十、随机抽样

Pandas 支持按照个数和比例进行随机抽样。

import numpy as np# 创建数据框df = pd.DataFrame(np.arange(600).reshape(100, 6),  columns=[\'A\', \'B\', \'C\', \'D\', \'E\', \'F\'])# 设置随机种子np.random.seed(seed=2)# 按照个数抽样(不放回)df.sample(n=10)# 按照个数抽样(有放回)df.sample(n=20, replace=True)# 按照百分比抽样(不放回)df.sample(frac=0.2)# 按照百分比抽样(有放回)new_df = df.sample(frac=0.2, replace=True)

十一、数据标准化

数据标准化可以消除量纲的影响,常见的标准化方式有 0~1 标准化和 Z 标准化。

# 导入数据df1 = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\11.数据标准化\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 0~1 标准化df1[\'国内生产总值0~1标准化\'] = \\ round((df1.国内生产总值 - df1.国内生产总值.min()) / (df1.国内生产总值.max() - df1.国内生产总值.min()), 2)df1[\'人均GDP 0~1标准化\'] = \\ round((df1.人均GDP - df1.人均GDP.min()) / (df1.人均GDP.max() - df1.人均GDP.min()), 2)# Z 标准化df1[\'国内生产总值Z标准化\'] = \\ round((df1.国内生产总值 - df1.国内生产总值.mean()) / (df1.国内生产总值.std()), 2)df1[\'人均GDP Z标准化\'] = \\ round((df1.人均GDP - df1.人均GDP.mean()) / (df1.人均GDP.std()), 2)

十二、数据分组

cut() 函数可以对数据进行分组。

# 导入数据df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\12.数据分组\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 对人均 GDP 进行分组bins = [min(df.人均GDP) - 1, 2000, 4000, 6000, 8000, max(df.人均GDP) + 1]df[\'人均GDP分组\'] = pd.cut(df.人均GDP, bins)# 自定义标签labels = [\'2000以下\', \'2001~4000\', \'4001~6000\', \'6001~8000\', \'8000以上\']df[\'人均GDP分组\'] = pd.cut(df.人均GDP, bins, labels=labels)

十三、时间格式数据处理

Pandas 提供了 to_datetime() 函数来处理时间格式数据。

# 导入数据df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\13.时间格式数据\\data1.csv\", encoding=\'gbk\', engine=\'python\')# 将字符型时间数据转化为时间格式数据df[\'时间\'] = pd.to_datetime(df.购买时间, format=\'%Y/%m/%d\')# 将时间格式的数据转化为指定字符型数据df[\'字符型时间\'] = df.时间.dt.strftime(\'%Y/%m/%d\')# 提取时间格式数据中的年、月、周、日、时、分、秒df[\'年\'] = df[\'时间\'].dt.yeardf[\'月\'] = df[\'时间\'].dt.monthdf[\'周\'] = df[\'时间\'].dt.weekdaydf[\'日\'] = df[\'时间\'].dt.daydf[\'时\'] = df[\'时间\'].dt.hourdf[\'分\'] = df[\'时间\'].dt.minutedf[\'秒\'] = df[\'时间\'].dt.second

十四、数据导出

处理完数据后,需要将结果导出保存。Pandas 支持将数据导出为 CSV 和 Excel 格式。

# 导出为 CSV 文件df_1.to_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\1. 数据导入与导出\\导出.csv\", index=True, header=True)# 导出为 Excel 文件df_1.to_excel( r\"C:\\Users\\Administrator\\Desktop\\new\\数据处理\\1. 数据导入与导出\\导出.xlsx\", index=True, header=True)

利用 Pandas 进行数据分析教学

一、引言

Pandas 是 Python 中一个强大的数据分析库,它提供了丰富的数据结构和数据处理功能,如 Series 和 DataFrame,能够方便地进行数据读取、清洗、分析和可视化等操作。下面将结合之前的代码片段,详细介绍如何利用 Pandas 进行数据分析。

二、数据读取

Pandas 支持多种数据格式的读取,常见的有 CSV 和 Excel 文件。

1. 读取 CSV 文件
import pandas as pd# 读取CSV文件df = pd.read_csv( r\"C:\\Users\\Administrator\\Desktop\\new\\简单数据分析\\1.统计描述\\data1.csv\", encoding=\'gbk\', engine=\'python\')
2. 读取 Excel 文件
import pandas as pd# 读取Excel文件df = pd.read_excel( r\"C:\\Users\\Administrator\\Desktop\\new\\简单数据分析\\4.相关分析\\data1.xlsx\", encoding=\'gbk\')

三、数据统计描述

统计描述可以帮助我们快速了解数据的基本特征,如数量、最大值、最小值、均值等。

# 基本统计数print(\"基本统计数:\")print(df.成绩.describe())# 成绩数量count = df.成绩.sizeprint(f\"成绩数量: {count}\")# 成绩的最大值max_score = df.成绩.max()print(f\"成绩的最大值: {max_score}\")# 成绩的最小值min_score = df.成绩.min()print(f\"成绩的最小值: {min_score}\")# 成绩的和sum_score = df.成绩.sum()print(f\"成绩的和: {sum_score}\")# 成绩的均值mean_score = df.成绩.mean()print(f\"成绩的均值: {mean_score}\")# 成绩的中位数median_score = df.成绩.median()print(f\"成绩的中位数: {median_score}\")# 成绩的方差var_score = df.成绩.var()print(f\"成绩的方差: {var_score}\")# 成绩的标准差std_score = df.成绩.std()print(f\"成绩的标准差: {std_score}\")# 累计求和cumsum_score = df.成绩.cumsum()print(\"成绩的累计求和:\")print(cumsum_score)# 最大值和最小值的位置argmin_score = df.成绩.argmin()argmax_score = df.成绩.argmax()print(f\"成绩最小值的位置: {argmin_score}\")print(f\"成绩最大值的位置: {argmax_score}\")# 求百分位数(排序为30%的数值)quantile_score = df.成绩.quantile( 0.3, interpolation=\'nearest\')print(f\"成绩排序为30%的数值: {quantile_score}\")

四、数据分组统计

1. 使用groupby函数进行分组统计
import numpy as np# 根据班级进行分组统计result1 = df.groupby(by=[\'班级\'])[\'成绩\'].agg( {\"总分\": np.sum, \"人数\": np.size, \"平均成绩\": np.mean, \"标准差\": np.std})print(\"根据班级分组统计结果:\")print(result1)# 自定义分组bins = [min(df.成绩) - 1, 70, 80, 90, max(df.成绩) + 1]labels = [\'70以下\', \'71~80\', \'81~90\', \'90以上\']df[\'分组\'] = pd.cut(df.成绩, bins, labels=labels)# 根据自定义分组进行分组统计result2 = df.groupby(by=[\'分组\'])[\'成绩\'].agg( {\"总分\": np.sum, \"人数\": np.size, \"平均成绩\": np.mean, \"标准差\": np.std})print(\"根据自定义分组统计结果:\")print(result2)
2. 生成数据透视表
# 生成数据透视表result = df.pivot_table(values=[\'成绩\'], index=[\'分组\'], columns=[\'性别\'], aggfunc=[np.mean])print(\"数据透视表结果:\")print(result)

五、数据相关性分析

计算两列之间的相关性以及相关系数矩阵。

# 计算两列之间的相关性correlation = df[\'人均GDP(元)\'].corr(df[\'人均消费水平(元)\'])print(f\"人均GDP(元)和人均消费水平(元)的相关性: {correlation}\")# 计算相关系数矩阵z = df[[\'人均GDP(元)\', \'人均消费水平(元)\']].corr()print(\"相关系数矩阵:\")print(z)