前言 pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language.(官网 )
下载依赖
引入依赖 1 2 3 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
Pandas维护的数据类型
Series:数据系列,用于保存和处理一维数据
数据系列符合NumPy数据类型标准,可以使用NumPy直接处理
DataFrame:数据表,用于保存和处理二维数据
Index:索引,用于索引Series和DataFrame对象
创建Series对象 通过列表创建Series对象 1 series_object = pd.Series(data=[1 , 2 , 3 ])
自定义索引 1 series_object = pd.Series(data=[1 , 2 , 3 ], index=["index_1" , "index_2" , "index_3" ])
通过字典创建Series对象
1 series_object = pd.Series(data={"index_1" : 1 , "index_2" : 2 , "index_3" : 3 })
Series对象的取值 直接取值
1 series_object["index_1" ]
花式索引
1 series_object[["index_1" ]]
布尔索引
1 series_object[series_object > 0 ]
切片
1 series_object[<index_start>:<index_end>]
Series对象的属性 获取索引对象
获取索引的值 1 series_object.index.values
获取索引的值 1 series_object.index.values
获取数据
获取元素个数
获取元素是否唯一
获取是否有空值
获取数据是否是单调递增 1 series_object.is_monotonic_increasing
获取数据是否是单调递减 1 series_object.is_monotonic_decreasing
Series对象的方法 求和
求平均数
求中位数
求众数
求最大值
求最小值
求标准差
求方差
求4分位数 求1/4位数 1 q1 = series_object.quantile(0.25 )
求3/4位数 1 q3 = series_object.quantile(0.75 )
求四分位距离
求所有描述性统计信息 1 new_series_object = series_object.describe()
删除指定位置的元素 1 series_object.drop(index=0 )
1 series_object.drop(index=[1 , 3 ])
对空值的相关操作 依次判断每个元素是否是NaN
依次判断每个元素是否不是NaN
删除NaN 1 series_object.dropna(inplace=True )
1 new_series_object = series_object.dropna()
通过布尔索引删除NaN 1 series_object[series_object.notnull()]
填充NaN 填充为指定值
填充为就近的上一个值 1 series_object.fillna(method="ffill" )
填充为就近的下一个值 1 series_object.fillna(method="bfill" )
填充就近的上一个值或下一个值 1 series_object.fillna(method="ffill" ).fillna(method="bfill" )
对重复值的相关操作 去重(Series) 遇到重复元素只保留第一项
inplace=True:在原对象上操作
1 series_object.drop_duplicates(inplace=True )
1 new_series_object = series_object.drop_duplicates()
遇到重复元素只保留最后一项 1 series_object.drop_duplicates(keep="last" , inplace=True )
1 new_series_object = series_object.drop_duplicates(keep="last" )
去除所有相同个数不唯一的元素 1 series_object.drop_duplicates(keep=False , inplace=True )
1 new_series_object = series_object.drop_duplicates(keep=False )
利用重复元素判断来去重
将不重复的数据标记为True,并通过布尔索引摘取所有标记为True的元素
1 new_series_object = [~series_object.drop_duplicated()]
去重(ndarray) 1 ndarray_object = series_object.unique()
获取不重复元素的个数
依次获取每种元素重复频率
1 series_object.value_counts()
依次判断每个元素是否重复 1 series_object.duplicated()
排序相关的操作 给索引排序 升序 1 series_object.sort_index()
1 series_object.sort_index(ascending=True )
降序 1 series_object.sort_index(ascending=False )
给值排序 升序 1 series_object.sort_values()
1 series_object.sort_values(ascending=True )
降序 1 series_object.sort_values(ascending=False )
求最大的几个值 1 series_object.nlargest(<num>)
求最小的几个值 1 series_object.nsmallest(<num>)
格式化数据为指定字符串 1 series_object.map ("{:.2f}" .format (x))
自动排除NaN 1 series_object.map ("{:.2f}" .format (x), na_action="ignore" )
替换指定值
1 series_object.replace({"替换前的值" : "替换后的值" , "替换前的值" : "替换后的值" })
执行回调函数 1 2 3 4 def func (x ): return x ** 0.5 * 10 new_series_object = series_object.map (func)
使用lambda函数作为回调函数 1 new_series_object = series_object.map (lambda x: x ** 0.5 * 10 )
1 new_series_object = series_object.apply(lambda x: x ** 0.5 * 10 )
分组聚合
level=0:定义分组的维度
分组求和 1 new_series_object = series_object.groupby(level=0 ).sum ()
Series对象利用封装的Matplotlib绘制图表 修改Matplotlib的字体和解决中文显示的问题 1 2 3 sns.set_theme() plt.rcParams['font.sans-serif' ] = ['SimHei' ] plt.rcParams["axes.unicode_minus" ] = False
修改图表分辨率
<width>:宽,单位英寸<height>:高,单位英寸
1 series_object.plot(kind="bar" , figsize(<width>, <height>))
输出为矢量图 1 %config InlineBackground.figure_format = "svg"
1 series_object.plot(kind="bar" )
绘制折线图 1 data_frame.plot(kind="line" )
绘制柱状图
color=['red', '#000000']:定义颜色y="<column_name>":根据指定单列数据绘制图表y=["<column_name_1>", "<column_name_2>"]:根据指定多列数据绘制图表
1 series_object.plot(kind="bar" )
绘制饼图
autopct="%.2f%%":自动显示百分比shadow=True:添加阴影pctdistance=1.3:百分比距离圆心的位置wedgeprops={"width": 0.3}:形状改为环状饼图
"width": 0.3:定义环的宽度edgecolor="white":定义分割线颜色
1 series_object.plot(kind="pie" )
创建DataFrame对象 通过构造器创建
index=[1, 2, 3]:定义行名columns=["A", "B", "C"]:定义列名
二维列表 1 2 3 arr = [[], [], []] data_frame_object = pd.DataFrame(arr)
二维数组 1 2 3 4 arr = [[], [], []] ndarray_object = np.array(arr) data_frame_object = pd.DataFrame(ndarray_object)
字典 1 2 3 4 5 6 7 dict_object = { "1" : [1 , 2 , 3 ], "2" : [1 , 2 , 3 ], "3" : [1 , 2 , 3 ], } data_frame_object = pd.DataFrame(dict_object)
读取CSV文件
index_col="<column_name>":将指定列作为索引列usecols=["<column_name_1>", "<column_name_2>"]:只获取指定列nrows=<num>:只获取前几行的数据skiprows=<num>:跳过前几行数据delimiter=","、sep=",":指定CSV文件的分隔符quotechar="\"":指定包裹数据的字符,在获取数据后会自动去除encoding="utf-8":指定文件编码格式
1 data_frame_object = pd.read_csv("<file>" )
使用迭代器读取数据
iterator=True:使用迭代器读取数据chunksize=<num>:指定迭代器每次读取的数据数
1 2 data_frame_iterator = pd.read_csv("<file>" , iterator=True , chunksize=<num>) iterator = next (data_frame_iterator)
读取Excel文件 读取xls文件需要下载依赖
读取xlsx文件需要下载依赖
读取Excel文件
index_col=0:指定索引列,如果不指定则会额外生成一组有序数列作为索引列sheet_name="<sheet_name>":指定读取的工作簿名称header=0:指定表头的索引nrows=<num>:只获取前几行的数据skiprows=<num>:跳过前几行数据na_values=None:指定被视为空值的值
1 data_frame_object = pd.read_excel("<file>" )
读取数据库 下载依赖
1 pip3 install mysqlclient
MySQL 8.x 需要安装cryptography库
1 pip3 install cryptography
建立连接 pymysql方式建立连接 1 conn = pymysql.connect(host="127.0.0.1" , port=3306 , user="<username>" , password="<password>" , database="<database_name>" , charset="utf8mb4" )
sqlalchemy方式建立连接 pymysql 1 conn = create_engine("mysql+pymysql://<username>:<password>@127.0.0.1:3306/<database_name>?charset=utf8mb4" )
mysqlclient 1 conn = create_engine("mysql://<username>:<password>@127.0.0.1:3306/<database_name>?charset=utf8mb4" )
读取数据库数据
index_col="<column_name>":将指定列作为索引列
1 data_frame_object = pd.read_sql("SELECT * FROM <table_name>" , conn)
通过DataFrame对象对数据表的读写 获取前几行的数据 1 data_frame_object.head(<num>)
获取后几行的数据 1 data_frame_object.tail(<num>)
获取指定列 取一个列
1 new_series_object = data_frame_object["<column_name>" ]
取多个列
1 new_data_frame_object = data_frame_object[["<column_name_1>" , "<column_name_2>" ]]
取指定行 取一个行 1 data_frame_object.loc[<column_name>]
取多个行 1 data_frame_object.loc[[<column_name>, <column_name>]]
取连续的多行 根据列名
1 data_frame_object.loc[[<column_name>:<column_name>]]
根据筛选
1 data_frame_object.iloc[<index_start>:<index_end>]
取单元格 1 data_frame_object.at[<row_name>, <column_name>]
1 data_frame_object.iat[<row_index>, <row_index>]
修改单元格的值 1 data_frame_object.at[<row_name>, <column_name>] = <value>
1 data_frame_object.iat[<row_index>, <row_index>] = <value>
末尾追加新列 新列赋值为相同值 1 data_frame_object["<new_column_name>" ] = <new_value>
新列赋值为不同值
1 data_frame_object["<new_column_name>" ] = [<new_value_1>, <new_value_2>]
末尾追加新行 为每一个是列都赋值
1 data_frame_object[<index_max>+1 ] = [<value_1>, <value_2>]
只为指定列赋值 1 data_frame_object[<index_max>+1 ] = {"<column_name>" : <value>}
DataFrame对象的方法 获取数据表相关信息 1 data_frame_object.info()
合并表 merge
如果外联表字段名相同
how="<type>":连接方式
inner:内连接,交集outer:外连接,并集left:左外连接right:右外连接
on="<field_name>":连接字段suffixes=("_x", "_y"):定义如果出现重复的列的字段后缀
1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_1.merge(data_frame_object_2, how="<type>" , on="<field_name>" )
如果外联表字段名不相同
left_on="<field_name>":定义左表连接字段right_on="<field_name>":定义右表连接字段
1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_1.merge(data_frame_object_2, how="<type>" , left_on="<field_name>" , right_on="<field_name>" )
直接根据外联表索引列作为关联 1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_1.merge(data_frame_object_2, how="<type>" , left_on="<field_name>" , right_index=True )
concat
ignore_index=True:忽略索引列的拼接,让索引延续
1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) pd.concat([data_frame_object_1, data_frame_object_2], axis=0 , join="outer" , ignore_index=True )
join
只拼接列
必须指定左表后缀或者右表后缀,也可以都指定,但是不能不指定
1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_1.join(data_frame_object_2, lsuffix='_left' , rsuffix='_ritht' )
append
ignore_index=True:忽略索引列的拼接,让索引延续
1 2 3 4 data_frame_object_1 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_2 = data_frame_object = pd.DataFrame([[], [], []]) data_frame_object_1.append(data_frame_object_2, ignore_index=True )
修改列名 1 data_frame_object.rename(columns={"<old_column_name>" : "<new_column_name>" }, inplace=True )
1 new_data_frame_object = data_frame_object.rename(columns={"<old_column_name>" : "<new_column_name>" })
删除指定列 1 data_frame_object.drop(columns=["<column_name>" ], inplace=True )
1 new_data_frame_object = data_frame_object.drop(columns=["<column_name>" ])
定义索引列 1 new_data_frame_object = data_frame_object.set_index("<column_name>" )
对空值的相关操作 判断空值 1 data_frame_object.isnull()
1 data_frame_object.notnull()
删除包含空值的行 1 data_frame_object.dropna()
删除包含空值的列
axis=1:指定维度
1 data_frame_object.dropna(axis=1 )
填充整个表的所有空值 1 data_frame_object.fillna("<value>" )
填充指定列的空值 1 data_frame_object["<column_name>" ].fillna("<value>" )
写入到数据表 1 data_frame_object["<column_name>" ] = data_frame_object["<column_name>" ].fillna("<value>" )
对重复值的相关操作 根据指定列判断是否是重复的行 根据单个列判断 1 data_frame_object.duplicated("<column_name>" )
根据多个列组合判断 1 data_frame_object.duplicated(["<column_name_1>" , "<column_name_2>" ])
去除被视为重复的行 不保留
1 data_frame_object.drop_duplicates("<column_name>" , keep=False )
保留首行 1 data_frame_object.drop_duplicates("<column_name>" )
1 data_frame_object.drop_duplicates("<column_name>" , keep="first" )
保留尾行 1 data_frame_object.drop_duplicates("<column_name>" , keep="last" )
替换 替换单个数据 1 new_data_frame_object = data_frame_object.replace("<old_value>" , "<new_value>" )
替换多个数据 1 new_data_frame_object = data_frame_object.replace(["<old_value_1>" , "<old_value_2>" ], ["<new_value_1>" , "<new_value_2>" ])
通过正则表达式替换 1 new_data_frame_object = data_frame_object.replace(r"<regex_pattern>" , "<new_value>" , regex=True )
对日期类型的相关操作 将字符串类型数据转换为日期类型 1 data_frame_object["<column_name>" ] = pd.to_datetime(data_frame_object["<column_name>" ])
获取日期的属性 1 data_frame_object["<column_name>" ].dt.<attribute>
对字符串的相关操作 1 data_frame_object["<column_name>" ].str .<attribute>
抽取 利用正则表达式作为抽取内容
1 data_frame_object["<column_name>" ].str .extract(r"<regex_pattern>" )
拆分 利用正则表达式作为分割符
expand=True:是否展开为多个列
True:展开为多个列,将数据拆分为每个列的数据False:不展开,返回一个Series对象,每个数据是一个列表,将数据拆分为列表中的每个数据
1 data_frame_object["<column_name>" ].str .split(r"<regex_pattern>" , regex=True , expand=True )
筛选 利用Python语法进行筛选 1 data_frame_object.query("'<str>' in <column_name>" )
1 data_frame_object.query("<column_name> == '<str_1>' or <column_name> == '<str_2>'" )
利用布尔索引进行筛选 1 data_frame_object[data_frame_object.str .contains("<str_1>" ) | data_frame_object.str .contains("<str_2>" )]
在每一个元素上执行回调函数 1 2 3 4 def func : pass data_frame_object["<column_name>" ].applymap(func)
转换每一个字符串元素为整型 1 data_frame_object["<column_name>" ].applymap(int )
转换每一个字符串元素为浮点型 1 data_frame_object["<column_name>" ].applymap(float )
调整列顺序
利用reindex函数调整列顺序 1 new_data_frame_object = data_frame_object.reindex(columns=["<column_name_1>" , "<column_name_2>" ])
利用reindex函数调整行顺序 1 new_data_frame_object = data_frame_object.reindex(index=["<index_name_1>" , "<index_name_2>" ])
利用花式索引调整列顺序 1 data_frame_object[["<column_name_1>" , "<column_name_2>" ]]
切割数据(分箱) 根据数值范围切割数据
right=True:定义区间
True:缺省值,左开右闭False:左闭右开
1 pd.cut(data_frame_object["<column_name>" ], bins=[0 , 50 , 100 ])
为每一段定义标签 1 pd.cut(data_frame_object["<column_name>" ], bins=[0 , 50 , 100 ], labels=["low" , "high" ])
根据次数平均分割 1 pd.qcut(data_frame_object["<column_name>" ], 2 )
根据比例切割 1 pd.qcut(data_frame_object["<column_name>" ], bins=[0 , 0.5 , 1 ])
将名义变量列转换为虚拟变量矩阵
1 pd.get_dummies(data_frame_object["<column_name>" ])
将定序变量列转换为值
1 2 3 4 5 def convert (arg ): results = {"key_1" : 1 , "key_2" : 2 , "key_3" : 3 } return results.get(arg, 0 ) data_frame_object["<column_name>" ].apply(convert)
排序
如果需要取最大的前几行数据或最小的前几行数据,可以使用nlargest和nsmallest函数,而不要先排序再取值,避免性能开销
根据单列排序
ascending=True:顺序
True:缺省值,升序False:降序
1 data_frame_object.sort_values(by="<column_name>" , ascending=True )
根据多列排序 1 data_frame_object.sort_values(by=["<column_name_1>" , "<column_name_2>" ], ascending=[True , False ])
获取最大的前几行的数据 1 data_frame_object.nlargest(<num>, "<column_name>" )
获取最小的前几行的数据 1 data_frame_object.nsmallest(<num>, "<column_name>" )
分组聚合 先分组再求和
根据<column_name_1>分组,根据<column_name_2>求和
1 new_data_frame_object = data_frame_object.groupby("<column_name_1>" )["<column_name_2>" ].sum ()
仍然返回DataFrame 1 new_data_frame_object = data_frame_object.groupby("<column_name_1>" )[["<column_name_2>" ]].sum ()
根据多个列分组
先根据<column_name_1>分组,再根据<column_name_2>分组,最后根据<column_name_3>求和
返回具有多级索引的DataFrame对象
1 new_data_frame_object = data_frame_object.groupby(["<column_name_1>" , "<column_name_2>" ])[["<column_name_3>" ]].sum ()
根据指定级索引进行分组 1 new_data_frame_object = data_frame_object.groupby(level=<level_num>)["<column_name>" ].sum ()
分组后求多个聚合 1 new_data_frame_object = data_frame_object.groupby("<column_name_1>" )["<column_name_2>" ].agg(["sum" , "max" , "min" , "count" ])
1 new_data_frame_object = data_frame_object.groupby("<column_name_1>" )["<column_name_2>" ].agg([np.sum , np.amax, np.amin])
得到指定组 1 new_data_frame_object = data_frame_object.groupby("<column_name_1>" ).get_group("<index_name>" )
透视 旋转行为列作为透视表
index="<column_name_1>":将指定列作为新表的索引columns="<column_name_2>":将指定列作为新表的列values="<column_name_3>":将指定列作为新表的值
1 new_data_frame_object = data_frame_object.pivot(index="<column_name_1>" , columns="<column_name_2>" , values="<column_name_3>" )
直接生成透视表
aggfunc="avg"、aggfunc=np.avg:指定单个聚合函数
np.avg:缺省值,求平均数np.sum:求和np.max:求最大值np.min:求最小值aggfunc=["avg", "sum"]、aggfunc=[np.avg, np.sum]:指定多个聚合函数fill_value=0:填充NaN值为0margins=True:添加汇总列margins_name="<column_name>":指定汇总列名
1 new_data_frame_object = data_frame_object.pivot_table(index="<column_name_1>" , columns="<column_name_2>" , values="<column_name_3>" )
1 new_data_frame_object = pd.pivot_table(data_frame_object, index="<column_name_1>" , columns="<column_name_2>" , values="<column_name_3>" )
堆叠和反堆叠 反堆叠
将具有多级索引的DataFrame转换为只有一级索引的DataFrame
1 new_data_frame_object = data_frame_object.unstack()
将指定级索引作为列 1 new_data_frame_object = data_frame_object.unstack(level=<level_num>)
堆叠
1 new_data_frame_object = data_frame_object.reset_index()
重新指定索引顺序 1 new_data_frame_object = data_frame_object.reorder_levels(["<column_name_1>" , "<column_name_2>" ])
交换索引级别 1 new_data_frame_object = data_frame_object.swaplevel(<level_num_1>, <level_num_2>)
随机抽样 指定抽样个数 1 new_data_frame_object = data_frame_object.sample(n=<num>)
指定抽样比例 1 new_data_frame_object = data_frame_object.sample(frac=0.5 )
按照时间抽样
method="ffill":填充空值
每周抽样一天 1 new_data_frame_object = data_frame_object.asfreq("W" )
每月抽样一天
1 new_data_frame_object = data_frame_object.asfreq("M" )
每隔10天取一次样本 1 new_data_frame_object = data_frame_object.asfreq("10D" )
将10天的数据作为一个组 1 new_data_frame_object = data_frame_object.resample("10D" ).sum ()
插值
线性插值 1 new_data_frame_object = data_frame_object.interpolate()
1 new_data_frame_object = data_frame_object.interpolate(method="linear" )
多项式插值
1 new_data_frame_object = data_frame_object.interpolate(method="polynomial" , order=2 )
就近填充 1 new_data_frame_object = data_frame_object.interpolate(method="pad" )
复合值展开
炸开单个列 1 new_data_frame_object = data_frame_object.explode("<column_name>" )
炸开多个列
多个列的复合值内的元素个数需要匹配,才可以同时炸开多个列
1 new_data_frame_object = data_frame_object.explode(["<column_name_1>" , "<column_name_2>" ])
环比 手动计算环比
1 data_frame_object["<column_name_2>" ] = data_frame_object["<column_name_1>" ].shift(1 )
1 (data_frame_object["<column_name_2>" ] - data_frame_object["<column_name_1>" ]) / data_frame_object["<column_name_1>" ] * 100
直接计算环比 1 data_frame_object["<column_name_2>" ] = data_frame_object["<column_name_1>" ].pct_change()
格式化数据 1 data_frame_object["<column_name_2>" ] = data_frame_object["<column_name_2>" ].pct_change().applymap(lambda x: "0" if np.isnan(x) else f"{x * 100 :.2 f} %" )
窗口计算 1 data_frame_object["<column_name>" ] = data_frame_object["<column_name>" ].rolling(<num>).mean()
协方差和相关系数 获取协方差
获取相关系数
如果相关系数是大于零,说明两个数是正相关
如果相关系数是小于零,说明两个数是负相关
如果相关系数是等于零或接近零,说明两个数没有相关
如果相关系数的绝对值在[0.6,1],说明两个数是强相关
如果相关系数的绝对值在[0.1,0.6),说明两个数是弱相关
如果相关系数的绝对值在[0,0.1),说明两个数没有相关
皮尔逊相关系数
计算所有数据的相关系数矩阵 1 data_frame_object.corr()
1 data_frame_object.corr("pearson" )
计算指定两列的相关系数 1 np.corrcoef(data_frame_object["<column_name_1>" ], data_frame_object["<column_name_2>" ])
斯皮尔曼相关系数
1 data_frame_object.corr("spearman" )
修改背景色 设置为渐变色
Reds:从白色到红色的渐变色ReYlBu:从红色到黄色到蓝色的渐变色
1 data_frame_object.style.background_gradient("Reds" )
保存为Excel文件 1 data_frame_object.to_excel("<file_name>.xlsx" )
Index索引类型 多级索引 创建多级索引MultiIndex 1 multi_index_object = pd.MultiIndex.from_product(([1 , 2 ], [3 , 4 ]), names=["<column_name_1>" , "<column_name_2>" ])
日期索引 创建日期索引DatetimeIndex 手动分段
periods=12:分段数
1 datetime_index_object = pd.date_range("2020-01-01" , "2020-12-01" , periods=12 )
以周分段
1 datetime_index_object = pd.date_range("2020-01-01" , "2020-12-01" , freq="W" )
偏移量 1 datetime_index_object = pd.date_range("2020-01-01" , "2020-12-01" , freq="W" ) + pd.DateOffset(days=1 )
设置日期的时区 1 datetime_index_object = datetime_index_object.tz_localize("Asia/Shanghai" )
转换日期的时区 1 datetime_index_object = datetime_index_object.tz_convert("Asia/Shanghai" )
完成 参考文献 哔哩哔哩——千锋教育 哔哩哔哩——骆昊jackfrued CSDN——一个甜甜的大橙子 CSDN——weixin_46115371 CSDN——夏日麦香