Pandas 是核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,本文主要总结数据分析中pandas的常用方法
python 版本:python3.7 pandas版本:'2.7.0'
1.引入模块
import pandas as pd
import numpy as np
2.数据生成 2.1Series Series是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引。
调用
pd.Series
函数即可创建 Series:s = pd.Series(data, index=index)
上述代码中,
data
支持以下数据类型:- Python 字典
Series
按字典的插入顺序排序索引(python3.7)data = https://www.it610.com/article/{'a': 3, 'b': 1, 'c': 2}
s = pd.Series(data)
s
文章图片
- 多维数组
data
是多维数组时,index 长度必须与 data 长度一致。没有指定 index
参数时,创建数值型索引,即 [0, ..., len(data) - 1]
。 s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
文章图片
- 标量值(如,5)
data
是标量值时,必须提供索引。Series
按索引长度重复该标量值。pd.Series(100., index=['a', 'b', 'c', 'd', 'e'])
文章图片
2.2DataFrame DataFrame 是由多种类型的列构成的二维标签数据结构,类似于 Excel 、SQL 表,或 Series 对象构成的字典。DataFrame 是最常用的 Pandas 对象,与 Series 一样,DataFrame 支持多种类型的输入数据:
- 一维 ndarray、列表、字典、Series 字典
多维数组的长度必须相同。如果传递了索引参数,
index
的长度必须与数组一致。如果没有传递索引参数,生成的结果是 range(n)
,n
为数组长度。data = https://www.it610.com/article/{'A': [1., 2., 3., 4.],
'B': [4., 3., 2., 1.]}
pd.DataFrame(data)
文章图片
pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
文章图片
用列表字典生成 DataFrame(自动生成range索引)
data = https://www.it610.com/article/[{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
文章图片
用 Series 字典或字典生成 DataFrame
生成的索引是每个 Series 索引的并集。先把嵌套字典转换为 Series。如果没有指定列,DataFrame 的列就是字典键的有序列表。
data = https://www.it610.com/article/{'A': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'B': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data)
df
文章图片
pd.DataFrame(data, index=['d', 'b', 'a'])
文章图片
pd.DataFrame(data, index=['d', 'b', 'a'], columns=['A', 'B'])
文章图片
用元组字典生成 DataFrame
元组字典可以自动创建多层索引 DataFrame。
pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
-
文章图片
二维 numpy.ndarray
pd.DataFrame(np.random.randn(5,5))
文章图片
3.数据读取 3.1pandas读取excel
pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None,
usecols=None, squeeze=False,dtype=None, engine=None,
converters=None, true_values=None, false_values=None,
skiprows=None, nrows=None, na_values=None, parse_dates=False,
date_parser=None, thousands=None, comment=None, skipfooter=0,
convert_float=True, **kwds)
1、io,文件存储路径
io = /home/work/xxxx.xlsx
2、sheet_name,sheet名称
可以是整型数字、列表名或SheetN,也可以是上述三种组成的列表。
整型数字:目标sheet所在的位置,以0为起始,比如sheet_name = 1代表第2个工作表。
3、header, 用哪一行作列名
4、names, 自定义最终的列名
5、index_col, 用作索引的列
6、usecols,需要读取哪些列
7、squeeze,当数据仅包含一列
8、converters ,强制规定列数据类型
9、skiprows,跳过特定行
10、nrows ,需要读取的行数
11、skipfooter , 跳过末尾n行
3.2pandas读取csv
pd.read_csv(filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]],
sep=',', delimiter=None, header='infer', names=None, index_col=None,
usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True,
dtype=None, engine=None, converters=None, true_values=None,
false_values=None, skipinitialspace=False, skiprows=None,
skipfooter=0, nrows=None, na_values=None, keep_default_na=True,
na_filter=True, verbose=False, skip_blank_lines=True,
parse_dates=False, infer_datetime_format=False,
keep_date_col=False, date_parser=None, dayfirst=False,
cache_dates=True, iterator=False, chunksize=None,
compression='infer', thousands=None, decimal: str = '.',
lineterminator=None, quotechar='"', quoting=0,
doublequote=True, escapechar=None, comment=None,
encoding=None, dialect=None, error_bad_lines=True,
warn_bad_lines=True, delim_whitespace=False,
low_memory=True, memory_map=False, float_precision=None)
filepath_or_buffer为第一个参数,没有默认值,也不能为空,根据Python的语法,第一个参数传参时可以不写参数名。可以传文件路径:
3.3pandas连接mysql,并读取数据 要实现 pandas 对 mysql 的读写需要三个库
- pandas
- sqlalchemy
- pymysql
read_sql_query 或 read_sql 方法传入参数均为 sql 语句,读取数据库后,返回内容是 dateframe 对象。
import pandas
from sqlalchemy import create_engineclass mysqlconn:
def __init__(self):
mysql_username = 'root'
mysql_password = '123456'
# 填写真实数库ip
mysql_ip = 'x.x.x.x'
port = 3306
db = 'work'
# 初始化数据库连接,使用pymysql库
self.engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(mysql_username, mysql_password, mysql_ip, port,db))# 查询mysql数据库
def query(self,sql):
df= pandas.read_sql_query(sql,self.engine)
# df = pandas.read_sql(sql,self.engine)这种读取方式也可以# 返回dateframe格式
return dfif __name__ =='__main__':
# 查询的 sql 语句
SQL = '''select * from working_time order by id desc '''
# 调用 mysqlconn 类的 query() 方法
df_data = https://www.it610.com/article/mysqlconn().query(sql=SQL)
2、to_sql 写入数据库
使用 to_sql 方法写入数据库之前,先把数据转化成 dateframe 。
import pandas
from sqlalchemy import create_engineclass mysqlconn:
def __init__(self):
mysql_username = 'root'
mysql_password = '123456'
# 填写真实数库ip
mysql_ip = 'mysql.mall.svc.test.local'
port = 3306
db = 'work'
# 初始化数据库连接,使用pymysql库
self.engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(mysql_username, mysql_password, mysql_ip, port,db))# 查询mysql数据库
def query(self,sql):
df= pandas.read_sql_query(sql,self.engine)
# df = pandas.read_sql(sql,self.engine)# 返回dateframe格式
return df# 写入mysql数据库
def to_sql(self,table,df):
# 第一个参数是表名
# if_exists:有三个值 fail、replace、append
# 1.fail:如果表存在,啥也不做
# 2.replace:如果表存在,删了表,再建立一个新表,把数据插入
# 3.append:如果表存在,把数据插入,如果表不存在创建一个表!!
# index 是否储存index列
df.to_sql(table, con=self.engine, if_exists='append', index=False)if __name__ =='__main__':
# 创建 dateframe 对象
df = pandas.DataFrame([{'name':'小米','price':'3999','colour':'白色'},{'name':'华为','price':'4999','colour':'黑色'}])
# 调用 mysqlconn 类的 to_sql() 方法
mysqlconn().to_sql('phonetest',df)
3.4pandasl连接oracle,并去读数据 1、登录oracle
首先先导入sqlalchemy库的create_engine,
通过 engine = create_engine("dialect+driver://username:password@host:port/database")初始化连接
参数说明:
dialect,是数据库类型包括:sqlite, mysql, postgresql, oracle,mssql等
driver,指定连接数据库的API,如:`psycopg2``, ``pyodbc``, ``cx_oracle``等,为可选关键字。
username,用户名
password,密码
host,网络地址,可以用ip,域名,计算机名,当然是你能访问到的。
port,数据库端口。
database,数据库名称。
from sqlalchemy importcreate_engine
engine = create_engine("oracle://scott:tiger@hostname/dbname",encoding='utf-8', echo=True)
2、read_sql
pd.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
参数说明:3、to_sql
sql,执行的sql,可为查询、删除、创建、更新等等的sql,在此可直接指定表名称,默认就是select * from tablename
con,指定的数据库连接,即con=engine,也就是我们刚才初始化的数据库连接engine
index_col,查询时,指定那一列为DataFrame的index,也可以是多列['a','b'],此时就生成了Multindex
coerce_float,boolean,默认为True,尝试转换float的值,用于设置sql查询的结果
params,list, tuple or dict, 可选关键字, 默认为:None,要传递给执行方法的参数列表。不太懂这个关键字,一般情况用不到
parse_dates, list or dict, 默认为 None,要解析为日期时间的字段
columns,查询时指定选择那些列,即select *from 中的*,默认全部列
chunksize,int,默认为None,如果指定数值,则返回一个迭代器,指定的数值为迭代器内数据的行数
DataFrame.to_sql(self, name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)
关键参数说明:4.数据查看
name,数据库表名
con,指定的数据库连接,即con=engine,也就是我们刚才初始化的数据库连接engine
schema,指定样式,不明白有什么用处
if_exists,{'fail', 'replace', 'append'}, 默认为'fail',即指定当数据库表存在时的处理方式,默认为fail,挂起一个错误
* fail: 挂起一个错误
* replace: drop掉原来的表,重新创建
* append: 在原来表基础上插入数据
index,boolean,默认为True,指定DataFrame的index是否一同写入数据库
index_label,在index关键字为True时,指定写入的index的字段名称,默认为None时,字段名称为index
chunksize,int,默认为None,如果指定数值,则返回一个迭代器,指定的数值为迭代器内数据的行数。当写入的数据量较大时,最好指定此关键字的数值
dtype,dict, 可选关键字,默认为None,即指定写入的字段字符类型,注意做好指定字符类型,因默认写入的数据类型数是colb,若没有指定数据类型,估计会报错。
dates = pd.date_range('20210101', periods=20)
df = pd.DataFrame(np.random.randn(20, 4), index=dates, columns=list('ABCD'))
文章图片
4.0显示设置
pd.set_option('display.max_rows',500)#设置展示最高行数
pd.set_option('display.max_columns',1000)#设置展示最高列数
pd.set_option('display.unicode.east_asian_width',True)#设置列名对齐
————————————————
4.1查看前几行数据
df.head()
文章图片
4.2查看前几行数据
df.tail()
文章图片
4.3查看dataframe的形状
df.shape
4.4数据表基本信息(维度、列名称、数据格式、所占空间等)(20, 4)
df.info()
4.5每一列数据的格式DatetimeIndex: 20 entries, 2021-01-01 to 2021-01-20 Freq: D Data columns (total 4 columns): #ColumnNon-Null CountDtype ---------------------------- 0A20 non-nullfloat64 1B20 non-nullfloat64 2C20 non-nullfloat64 3D20 non-nullfloat64 dtypes: float64(4) memory usage: 800.0 bytes
df.dtype
4.6某一列数据的格式Afloat64 Bfloat64 Cfloat64 Dfloat64 dtype: object
df['B'].dtype
4.7空值dtype('float64')
df.isnull()
文章图片
df.isna()
4.8某一列空值
文章图片
df['B'].isnull()
文章图片
df['B'].isna()
isna()和 isnull()区别:
文章图片
isnan判断是否nan(not a number),一般是数值字段的null
isnull()主要是判断字符型是否有值, 可以判断所有的空值,但是python的数值字段比如int float 为空的时候默认是Nan
4.9查看列名称
文章图片
可以看到isna()对,字符型空值不起作用
文章图片
df.columns
4.10查看索引Index(['A', 'B', 'C', 'D', 'F'], dtype='object')
df.index
4.11查看某一列的唯一值DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06', '2021-01-07', '2021-01-08', '2021-01-09', '2021-01-10', '2021-01-11', '2021-01-12', '2021-01-13', '2021-01-14', '2021-01-15', '2021-01-16', '2021-01-17', '2021-01-18', '2021-01-19', '2021-01-20'], dtype='datetime64[ns]', freq='D')
df['F'].unique()
4.12查看统计信息array(['f', ''], dtype=object)
df.describe()
文章图片
5.数据筛选 5.1布尔索引
df[df['F'] == 'f'] # 判断等式是否成立
文章图片
5.2位置索引(iloc) 是根据行号来索引,行号从0开始,逐次加1
# 直接根据行号取值
df.iloc[1:2]
文章图片
5.3标签索引(loc)
# 直接根据索引取值
df.loc["2021-01-02":"2021-01-02"]
文章图片
# 使用布尔
df.loc[df['A']==2]
不同:
1. loc函数通过调用index名称的具体值来取数据
2. iloc函数通过行序号来取数据
3. 取多行数据时iloc不包含末尾
4. 对数据进行筛选使用loc函数,当使用loc函数时,如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理,可用.reset_index()函数重置
5.4使用API
df.query('F=="f"')
# 多条件查询
df.query('A==1 | B==2')
6.常用函数 6.1窗口函数rolling()
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window:时间窗的大小,数值int,即向前几个数据(可以理解将最近的几个值进行group by)
min_periods:最少需要有值的观测点的数量,对于int类型,默认与window相等
center:把窗口的标签设置为居中,布尔型,默认False
win_type: 窗口的类型,截取窗的各种函数。字符串类型,默认为None
on: 可选参数,对于dataframe而言,指定要计算滚动窗口的列,值为列名
closed:定义区间的开闭,支持int类型的window,对于offset类型默认是左开右闭的即默认为right,可以根据情况指定为left、both等
axis:方向(轴),一般都是0
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np# 创建DF
df = pd.DataFrame(np.random.randint(5, size=(10, 2)), index=pd.date_range('1/1/2020', periods=10), columns=['A', 'B'])
# 将B列最近2个值相加并生成新列
df['C'] = df['B'].rolling(window=2).sum()
# 将B列最近5个值相加并生成新列
df['D'] = df['B'].rolling(window=5).sum()# 将B列最近2个值求平均并生成新列
df['E'] = df['B'].rolling(window=2).mean()
# 将B列最近5个值求平均并生成新列
df['F'] = df['B'].rolling(window=5).mean()print(df)
ABCDEF
2020-01-0140NaNNaNNaNNaN
2020-01-02411.0NaN0.5NaN
2020-01-03145.0NaN2.5NaN
2020-01-04226.0NaN3.0NaN
2020-01-05013.08.01.51.6
2020-01-06212.09.01.01.8
2020-01-07412.09.01.01.8
2020-01-08301.05.00.51.0
2020-01-09344.07.02.01.4
2020-01-10337.09.03.51.8
常用聚合函数:7.数据排序 Pandas 支持三种排序方式,按索引标签排序,按列里的值排序,按两种方式混合排序。
mean() 求平均
count() 非空观测值数量
sum() 值的总和
median() 值的算术中值
min() 最小值
max() 最大
std() 贝塞尔修正样本标准差
var() 无偏方差
skew() 样品偏斜度(三阶矩)
kurt() 样品峰度(四阶矩)
quantile() 样本分位数(百分位上的值)
cov() 无偏协方差(二元)
corr() 相关(二进制)
7.1 按索引标签排序 Series.sort_index() 与 DataFrame.sort_index() 方法用于按索引层级对 Pandas 对象排序。
7.2 按值排序 Series.sort_values()方法用于按值对 Series 排序。
‘DataFrame.sort_values() 方法用于按行列的值对 DataFrame 排序。
DataFrame.sort_values() 的可选参数
by
用于指定按哪列排序,该参数的值可以是一列或多列数据。这些方法支持用
na_position
参数处理空值。na_position='first'(空置排在前面)
7.3 混合排序 通过参数
by
传递给 DataFrame.sort_values()的字符串可以引用列或索引层名。7.4搜索排序
Series 支持 searchsorted() 方法,这与numpy.ndarray.searchsorted() (opens new window)的操作方式类似。
7.5最大值与最小值
df.loc[:,'A'].nsmallest(3)
2021-01-010 2021-01-020 2021-01-030 Freq: D, Name: A, dtype: int64
df.loc[:,'A'].nlargest(3)
8.数据拼接2021-01-071 2021-01-081 2021-01-121 Name: A, dtype: int64
9.数据聚合
10.时间日期
11.函数应用 管是为 Pandas 对象应用自定义函数,还是应用第三方函数,都离不开以下三种方法。用哪种方法取决于操作的对象是
DataFrame
,还是 Series
;是行、列,还是元素。- 表级函数应用:pipe()
- 行列级函数应用: apply()
- 聚合 API: agg() 与 transform()
- 元素级函数应用:applymap()
# f、g、h 是提取、返回 `DataFrames` 的函数
>>> f(g(h(df), arg1=1), arg2=2, arg3=3)
>>> (df.pipe(h)
....pipe(g, arg1=1)
....pipe(f, arg2=2, arg3=3))
2、行列级函数应用 apply() 方法沿着 DataFrame 的轴应用函数,比如,描述性统计方法,该方法支持
axis
参数。 df.iloc[:,:4].apply(np.mean)
A0.300000 B-0.054087 C0.117827 D0.020045 dtype: float64
df.iloc[:,:4].apply(np.mean, axis=1)
apply()方法还支持通过函数名字符串调用函数。2021-01-01-0.035445 2021-01-02-0.713445 2021-01-030.081043 2021-01-040.002215 2021-01-05-0.259167 2021-01-060.093416 2021-01-07-0.190826 2021-01-08-0.305420 2021-01-09-0.024411 2021-01-100.486128 2021-01-110.303144 2021-01-120.186884 2021-01-130.325273 2021-01-140.397488 2021-01-150.478969 2021-01-160.247686 2021-01-170.351837 2021-01-180.650051 2021-01-190.071887 2021-01-20-0.228385 Freq: D, dtype: float64
df.iloc[:,:4].apply('mean')
A0.300000 B-0.054087 C0.117827 D0.020045 dtype: float64
df.iloc[:,:4].apply('mean',axis=1)
默认情况下,apply()调用的函数返回的类型会影响2021-01-01-0.035445 2021-01-02-0.713445 2021-01-030.081043 2021-01-040.002215 2021-01-05-0.259167 2021-01-060.093416 2021-01-07-0.190826 2021-01-08-0.305420 2021-01-09-0.024411 2021-01-100.486128 2021-01-110.303144 2021-01-120.186884 2021-01-130.325273 2021-01-140.397488 2021-01-150.478969 2021-01-160.247686 2021-01-170.351837 2021-01-180.650051 2021-01-190.071887 2021-01-20-0.228385 Freq: D, dtype: float64
DataFrame.apply
输出结果的类型。- 函数返回的是
Series
时,最终输出结果是DataFrame
。输出的列与函数返回的Series
索引相匹配。
- 函数返回其它任意类型时,输出结果是
Series
。
result_type
会覆盖默认行为,该参数有三个选项:reduce
、broadcast
、expand
。这些选项决定了列表型返回值是否扩展为 DataFrame
。apply()有一个参数
raw
,默认值为 False
,在应用函数前,使用该参数可以将每行或列转换为 Series
。该参数为 True
时,传递的函数接收 ndarray 对象,若不需要索引功能,这种操作能显著提高性能。3、聚合 API
聚合 API 可以快速、简洁地执行多个聚合操作。Pandas 对象支持多个类似的 API,如 groupby API、window functions API、resample API 。聚合函数为DataFrame.aggregate() ,它的别名是 DataFrame.agg() 。
1AGG
单函数聚合
应用单个函数时,该操作与 apply() 等效,这里也可以用字符串表示聚合函数名。下面的聚合函数输出的结果为
Series
:df.iloc[:,:4].agg(np.mean)
A0.300000 B-0.054087 C0.117827 D0.020045 dtype: float64
df.iloc[:,:4].agg(np.mean,axis=1)
2021-01-01-0.035445 2021-01-02-0.713445 2021-01-030.081043 2021-01-040.002215 2021-01-05-0.259167 2021-01-060.093416 2021-01-07-0.190826 2021-01-08-0.305420 2021-01-09-0.024411 2021-01-100.486128 2021-01-110.303144 2021-01-120.186884 2021-01-130.325273 2021-01-140.397488 2021-01-150.478969 2021-01-160.247686 2021-01-170.351837 2021-01-180.650051 2021-01-190.071887 2021-01-20-0.228385 Freq: D, dtype: float64
Series
单个聚合操作返回标量值:df.loc[:,'A'].agg('sum')
多函数聚合6
还可以用列表形式传递多个聚合函数。每个函数在输出结果
DataFrame
里以行的形式显示,行名是每个聚合函数的函数名。df.iloc[:,:4].agg(['sum', 'mean'])
文章图片
?
df.iloc[:,:4].agg(['sum', 'mean'],axis=1)
文章图片
?
Series
聚合多函数返回结果还是 Series
,索引为函数名:df.loc[:,'A'].agg(['sum', 'mean'])
传递sum6.0 mean0.3 Name: A, dtype: float64
lambda
函数时,输出名为
的行:df.loc[:,'A'].agg(['sum', lambda x: x.mean()])
应用自定义函数时,该函数名为输出结果的行名:sum6.00.3 Name: A, dtype: float64
def mymean(x):
return x.mean()df.loc[:,'A'].agg(['sum', mymean])
用字典实现聚合sum6.0 mymean0.3 Name: A, dtype: float64
指定为哪些列应用哪些聚合函数时,需要把包含列名与标量(或标量列表)的字典传递给
DataFrame.agg
。注意:这里输出结果的顺序不是固定的,要想让输出顺序与输入顺序一致,请使用
OrderedDict
。df.agg({'A': 'mean', 'B': 'sum'})
输入的参数是列表时,输出结果为A0.300000 B-1.081742 dtype: float64
DataFrame
,并以矩阵形式显示所有聚合函数的计算结果,且输出结果由所有唯一函数组成。未执行聚合操作的列输出结果为 NaN
值:df.agg({'A': ['mean', 'min'], 'B': 'sum'})
多种数据类型(Dtype)
文章图片
?
与
groupby
的 .agg
操作类似,DataFrame 含不能执行聚合的数据类型时,.agg
只计算可聚合的列(数值,字符串等类型)2Transform API
transform()方法的返回结果与原始数据的索引相同,大小相同。与 .agg API 类似,该 API 支持同时处理多种操作,不用一个一个操作。
这里转换的是整个 DataFrame。
.transform()
支持 NumPy 函数、字符串函数及自定义函数。df.iloc[:,:4].transform(np.abs)
df.iloc[:,:4].transform('abs')
df.iloc[:,:4].transform(lambda x: x.abs())
.transform()
向 Series
传递单个函数时,返回的结果也是单个 Series
。多函数 Transform
transform()
调用多个函数时,生成多层索引 DataFrame。第一层是原始数据集的列名;第二层是 transform()
调用的函数名。df.iloc[:,:4].transform([np.abs, lambda x: x + 1])
用字典执行
文章图片
transform
操作df.iloc[:,:4].transform({'A': np.abs, 'B': lambda x: x + 1})
transform() 的参数是列表字典时,生成的是以 transform() 调用的函数为名的多层索引 DataFrame。
文章图片
4、元素级函数应用 并非所有函数都能矢量化,即接受 NumPy 数组,返回另一个数组或值,DataFrame 的 applymap()及 Series 的 map(),支持任何接收单个值并返回单个值的 Python 函数。
Series.map() 还有个功能,可以“连接”或“映射”第二个 Series 定义的值。这与 merging / joining 功能 联系非常紧密:
12.变形操作
- 重塑(stack,unstack)
- 透视表与逆透视
- 哑变量与因子化
12.1重塑(stack,unstack)
- stack: 将数据的列columns转旋转成行index
- unstack:将数据的行index旋转成列columns
- 二者默认操作的都是最内层
stack stack函数的主要作用是将原来的列转成最内层的行索引,转换之后都是多层次索引。
文章图片
stack()即“堆叠”,作用是将列旋转到行
result = df.stack()
result
2021-01-01A0 B-0.067474 C1.358357 D-1.432663 Ff ... 2021-01-20A0 B-1.106931 C-0.762231 D0.95562 Ff Length: 100, dtype: objectstack操作后将列索引旋转为行索引,并且置于行索引的最内层(外层为原索引),也就是将旋转轴的结果置于最低级别。
pd.stack(level=-1, dropna=True)
#模拟数据
multicol2 = pd.MultiIndex.from_tuples([('weight', 'kg'),# 多层次列属性
('height', 'm')],
name=["col","unit"])data1 = pd.DataFrame([[1.0, 2.0], [3.0, 4.0]],
index=['cat', 'dog'],
columns=multicol2
)data1
文章图片
data1.stack()#默认最内层,
文章图片
data1.stack(0)#
文章图片
还可以同时对多个进行操作,指定名称或者索引号:
data1.stack([0,1])
参数dropna
文章图片
#生成测试数据
data2 = pd.DataFrame([[None, 2.0],# 引入一个缺失值
[4.0, 6.0]],
index=['cat', 'dog'],
columns=multicol2)
data2
文章图片
data2.stack()#默认为True
文章图片
data2.stack(dropna = False)#False,会保留同时为NaN的数据:
文章图片
unstack()即stack()的反操作,将行旋转到列
unstack操作默认将内层索引number旋转为列索引。
同时,也可以指定分层级别或者索引名称来指定操作级别。
unstack(level=- 1, fill_value=https://www.it610.com/article/None)
- level:进行操作的索引层级,可以是名称
- fill_value:当我们进行操作的时候,如果产生了缺失值,可以用指定的值填充
文章图片
data3.unstack()#默认最内层
文章图片
data3.unstack(0)#可以用参数科名称选索引
参数fill_value
文章图片
该参数的作用是当我们使用unstack进行操作的时候,产生的缺失值用指定数据填充。
对产生的缺失值进行填充:
- 默认情况的使用
- 使用名称
- 使用索引号
1.pivot()
df.pivot(index=, columns=, values=)
index
是重塑的新表的索引名称columns
是重塑的新表的列名称values
就是生成新列的值,如果没有,则会对dataframef剩下未统计的列进行重新排列放到columns
的上层#测试数据
df = pd.DataFrame({'foo': ['one','one','one','two','two','two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6]})
文章图片
df.pivot(index='foo', columns='bar', values='baz')
pandas.pivot行与列的交叉点值的索引应该是唯一值,如果不是唯一值,则会报错:
文章图片
#测试数据
df1 = pd.DataFrame({'foo': ['one','one','one','one','two','two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6]})
文章图片
df1.pivot(index='foo', columns='bar', values='baz')2.pivot_table
ValueError: Index contains duplicate entries, cannot reshape
pivot_table(data, values=None, index=None, columns=None,aggfunc='mean', fill_value=https://www.it610.com/article/None, margins=False, dropna=True, margins_name='All')
参数 Index
每个pivot_table必须拥有一个index:
pd.pivot_table(df,index=[u'foo'])
可以存在多个index
文章图片
pd.pivot_table(df,index=[u'foo',u'bar'])
参数values
文章图片
values可以对需要的计算数据进行筛选
pd.pivot_table(df,index=[u'foo',u'bar'],values=[u'baz'])
aggfunc
文章图片
【python|数据分析--pandas常用操作】aggfunc参数可以设置对数据聚合时进行的函数操作。
pd.pivot_table(df,index=[u'foo',u'bar'],values=[u'baz'],aggfunc=[np.sum])
columns
文章图片
Columns类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。
pd.pivot_table(df,index=[u'foo'],values=[u'baz'],aggfunc=[np.sum],columns=u'bar')
3.melt
文章图片
pandas.melt(dataframe,
id_vars=None, value_vars=None,
var_name=None,value_name=‘value’,
col_level=None)
frame : 就是指我们要操作的DataFrame;
id_vars : 就是我们自行指定哪些列作为identifier variables;
可以为tuple, list, or ndarray, optional Column(s)等
value_vars:指定哪些列被unprivot,我觉得就是把列转化为一行一行的键值对
可以为tuple, list, or ndarray, optional Column(s)等
var_name:给varivale那一列的别名。如果没指定或者为None,那么则默认为frame.columns.name 或者varivale
value_name:给value那一列的别名。默认为value
col_level:
df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
'B': {0: 1, 1: 3, 2: 5},
'C': {0: 2, 1: 4, 2: 6}})
文章图片
pd.melt(df, id_vars=['A'], value_vars=['B'])
文章图片
pd.melt(df, id_vars=['A'], value_vars=['B','C'])
12.3哑变量与因子化
文章图片
13.重复值操作
14.排名操作(rank)
DataFrame.rank(axis=0,
method='average',
numeric_only=None,
na_option='keep',
ascending=True,
pct=False)
15.数据清洗
- axis:表示排名是根据哪个轴,axis=0表示横轴,axis=1表示纵轴
- method:取值可以为'average','first','min', 'max','dense';后面重点介绍,默认是average
- numeric_only:是否仅仅计算数字型的columns
- na_optiaon:NaN值是否参与排名以及如何排名,取值为keep、top、bottom
- ascending:升序还是降序;默认是升序
- pct:是否以排名的百分比显示排名;所有排名和最大排名的百分比
16.数据输出
推荐阅读
- Python|Python 获取字典中的第一个键
- Python|我写的 Python 代码,同事都说好
- pygame|Python学习路线图(2022年最新版)
- Linux|Vim 编辑器|批量注释与批量取消注释
- Python|错误的路线害死人,2022最全Python爬虫学习路线和学习资料
- 大作业|Python大作业一
- python|学了这么久python,你居然还不知道什么是爬虫(看完这篇文章你就明白了!)
- 最新小红书数据app爬虫数据接口
- Python 自动清理电脑垃圾文件,一键启动即可