python实用派
第一章 python是什么?初始化
第二章 python基础内容(1)
第三章 python基础内容(2)
第四章 python进阶之numpy库
第五章 python进阶之pandas库
第六章 python进阶之求解器应用–gurobi求解器
第七章 python进阶之求解器应用–cplex求解器
第八章 python进阶之数据可视化篇
第九章 python进阶之爬虫篇
【第五章 python进阶之pandas库】
推荐一些网站
Python数据分析
菜鸟教程
CSDN
博客园
知乎
…
一. 初识pandas
pandas是基于numpy的一个数据处理模块
, 它拥有使数据清洗和分析⼯作变得更快更简单的数据结构和操作⼯具,可以高效快捷的完成数据处理的操作。多用于处理表格数据。
<可以说pandas就是可自定义命令的excel,熟练使用pandas,处理表格数据将更简单快捷>
1. 安装导入pandas包
首先,安装pandas包,可通过以下cmd命令
pip install pandas
亦可通过pycharm简单直接安装。
导入pandas包
import pandas as pd
习惯性的用pd来简化pandas包名称
2. 数据结构------Series
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。
Series 由索引(index)和列组成,构造方法如下:
pandas.Series( data, index, dtype, name, copy)
参数说明:
data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。
索引就好比是字典的键
import pandas as pd
dict1 = {'a':1,
'b':2,
'c':3}
ser1 = pd.Series(dict1)
print(ser1)
#results:
a 1 # a为索引,1则是对应的列
b 2
c 3
3. 数据结构------DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
主要分清两个点:行索引和列索引
行为index,列为column
pandas.DataFrame( data, index, columns, dtype, copy)
data:一组数据(ndarray、series, map, lists, dict 等类型)。
index:索引值,或者可以称为行标签,默认为 (0, 1, 2, …, n)。
columns:列标签,默认为 (0, 1, 2, …, n) 。
dtype:数据类型。
copy:拷贝数据,默认为 False。
DataFrame 是一个二维的数组结构,可以看做是一个表格。
data = {
"a": [420, 380, 390],
"b": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data, index=['x','y','z'])
print(df)
#results:
a b
x 420 50
y 380 40
z 390 45
二. pandas表格操作
1. 索引
(1)loc 轴标签索引
用轴标签进行索引
df.loc[a,b]
a和b分别为行标签和列标签,ab可以为切片
data = {
"a": [420, 380, 390],
"b": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data, index=['x','y','z'])
print(df)
#results:
a b
x 420 50
y 380 40
z 390 45
print(df.loc[['x','z'], 'a'])
#results:
x 420
z 390
Name: a, dtype: int64
(2)iloc 整数索引
通过整数位置进行索引
df.iloc[a,b]
a,b分别为行位置和列位置,ab可以切片
print(df.iloc[:2, 1])
#results:
x 50
y 40
Name: b, dtype: int64
(3)直接根据列名称索引
通过列名称直接进行索引
print(df['b'])
#results:
x 50
y 40
z 45
Name: b, dtype: int64
(4)条件筛选
用中括号 [] 的方式,除了直接指定选中某些列外,还能接收一个条件语句,然后筛选出符合条件的行/列
import numpy as np
df = pd.DataFrame(np.random.rand(4,4), index=['A','B','C','D'], columns=['W','X','Y','Z'])
print(df)
#results:
W X Y Z
A 0.843444 0.118855 0.180719 0.137154
B 0.363363 0.737478 0.337769 0.486234
C 0.854239 0.986581 0.765552 0.894609
D 0.316096 0.285792 0.903406 0.376815
print(df[(df['W']>0.4) & df['X']>0.4])
#results:
W X Y Z
A 0.843444 0.118855 0.180719 0.137154
C 0.854239 0.986581 0.765552 0.894609
2. 数据清洗
(1)处理缺失数据
如果我们要删除包含空字段的行,可以使用 dropna() 方法,语法格式如下:
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how:默认为 ‘any’ 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how=‘all’ 一行(或列)都是 NA 才去掉这整行。
thresh:设置需要多少非空值的数据才可以保留下来的。
subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
我们可以通过 isnull() 判断各个单元格是否为空。
(2)填充缺失数据
你可能不想滤除缺失数据(有可能会丢弃跟它有关的其他数据),⽽是希望通过其他⽅式填补那些“空洞”。对于⼤多数情况⽽⾔,fillna⽅法是最主要的函数。
DataFrame.fillna(value)
该函数的功能是用指定的值去填充dataframe中的缺失值
如果传入一个字典,则是根据字典的键为列名,字典的值为填充值进行填充
如:
DataFrame.fillna({'a':0,'b':0.5}) # 表示a列的缺失值用0填充,b列的缺失值用0.5填充
或者我们可以直接索引列进行缺失值填充
如
df['a'].fillna(0}) # 表示a列的缺失值用0填充
在实际操作中,我们替换空单元格的常用方法是计算列的均值、中位数值或众数。
Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。如
df['a'].fillna(mean(df['a'])) # 表示a列的缺失值用a列的平均数来填充
结合fillna函数即可完成相应的缺失值填充操作
(3)移除重复数据
我们可以用DataFrame的duplicated⽅法返回⼀个布尔型Series,表示各⾏是否是重复⾏
df.duplicated() # 表示a列的缺失值用a列的平均数来填充
如果对应的数据是重复的,duplicated() 会返回 True,否则返回 False。
duplicated()括号中为空时表示判断整个df,也可以传入参数 列名称,判断某一列的重复情况
接下来是删除重复值
df.drop_duplicates()
drop_duplicated()括号中为空时表示判断整个df,也可以传入参数 列名称,依据某一列的重复进行 行的删除
drop_duplicates默认保留的是第⼀个出现的值组合。传⼊keep='last’则保留最后⼀个
(4)重命名轴索引
rename可以实现复制DataFrame并对其索引和列标签进⾏赋值。如果希望就地修改某个数据集,传⼊inplace=True即可
df.rename(index, columns, inplace)
index :传入一个字典,则可以将字典中键对应的行标签改为字典值对应的名称,或者是传入一个函数(复杂)
columns 传入一个字典,则可以将字典中键对应的列标签改为字典值对应的名称,或者是传入一个函数(复杂)
inplace=True 则会对df进行更改,而False则是不对原来的df进行更改而是返回一个新的df
如
df = pd.DataFrame(np.random.rand(4,4), index=['A','B','C','D'], columns=['W','X','Y','Z'])
print(df)
#results:
W X Y Z
A 0.289082 0.554506 0.414968 0.376596
B 0.038046 0.576139 0.886379 0.104810
C 0.050232 0.549597 0.982683 0.297909
D 0.948161 0.383481 0.314556 0.116062
df.rename(index=str.lower, columns={'W':'w','Z':'z'}, inplace=True) # 表示将原来的行标签变为小写,列标签按名称进行修改
print(df)
#results:
w X Y z
a 0.289082 0.554506 0.414968 0.376596
b 0.038046 0.576139 0.886379 0.104810
c 0.050232 0.549597 0.982683 0.297909
d 0.948161 0.383481 0.314556 0.116062
(5)数据替换
df.replace(a, b) #将a替换为b
3. 数据规整
(1) 层次化索引
层次化索引是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。
index=[['a', 'a', 'b', 'b'], [1, 2, 3, 4]]
columns = [['x','x','y'],['u1', 'u2', 'u3']]
frame = pd.DataFrame(np.random.randn(12).reshape((4,3)), index=index,columns=columns)
print(frame)
#results:
x y
u1 u2 u3
a 1 -0.544696 0.117915 -2.019788
2 -2.336332 0.594011 1.043261
b 3 -0.951309 -0.363159 0.514077
4 0.558613 -0.529342 -0.396981
(2) groupby分组
在日常数据分析过程中,经常有分组的需求。具体来说,就是根据一个或者多个字段,将数据划分为不同的组,groupby是pandas中用于数据分析的一个重要功能. 举例来说明一下
data = pd.DataFrame([[1,2,3],[1,3,4],[2,6,4],[2,3,5],[4,1,2],[5,2,1]],index=list(range(6)), columns=['s%d'%i for i in range(3)])
print(data)
#results:
s0 s1 s2
0 1 2 3
1 1 3 4
2 2 6 4
3 2 3 5
4 4 1 2
5 5 2 1
group_data=data.groupby("s0")
print(group_data)
#results:
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000213D99C6700> #一个DataFrameGroupBy对象
print(list(group_data))
#results:
[(1, s0 s1 s2
0 1 2 3
1 1 3 4),
(2, s0 s1 s2
2 2 6 4
3 2 3 5),
(4, s0 s1 s2
4 4 1 2),
(5, s0 s1 s2
5 5 2 1)]
可以观察到DataFrameGroupBy对象中,第一层为元组,元组中的第一个对象为组别,第二个对象是一个DataFrame对象
我们可以进一步对分组后的DataFrame对象进行操作。
总结来说,groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。
了解完groupby的基础后,下面来讲讲groupby之后的常见操作
- agg 聚合操作
聚合操作是通过agg来完成的,可以指定一个列或者多个列分别使用不同的聚合函数来聚合
包括min,max,sum,mean等等一些函数,
print(group_data.agg('mean'))
#results:
s1 s2
s0
1 2.5 3.5
2 4.5 4.5
4 1.0 2.0
5 2.0 1.0 # 输出了各个分组的每一列对应的均值
- transform
data['avg_s1'] = data.groupby('s0')['s1'].transform('mean') # 表示按s0分组后求每组s1的均值 然后将其附给新建的avg_s1列
print(data)
#results:
s0 s1 s2 avg_s1
0 1 2 3 2.5
1 1 3 4 2.5
2 2 6 4 4.5
3 2 3 5 4.5
4 4 1 2 1.0
5 5 2 1 2.0
(3) 合并数据
pandas的concat函数
pd.concat([a,b,c,...], axis)
将dataframe对象 abc…按照axis指定的轴进行拼接,axis=0是按照行进行拼接,1是按照列进行拼接
三. 表格读取与存储
1. csv文件
(1) 读取
易于读取和存储,CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
Pandas 可以很方便的处理 CSV 文件,在pycharm等软件中查看方便。
pd.read_csv(filepath_or_buffer, 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, 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, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)
1.filepath_or_buffer:(这是唯一一个必须有的参数,其它都是按需求选用的)
文件所在处的路径
2.header:
指定哪一行作为表头。默认设置为0(即第一行作为表头),如果没有表头的话,要修改参数,设置header=None
3.names:
指定列的名称,用列表表示。一般我们没有表头,即header=None时,这个用来添加列名就很有用啦!
4.index_col:
指定哪一列数据作为行索引,可以是一列,也可以多列。多列的话,会看到一个分层索引
5.nrows : int, default None
需要读取的行数(从文件头开始算起)
6.encoding:
乱码的时候用这个就是了,官网文档看看用哪个:
https://docs.python.org/3/library/codecs.html#standard-encodings
7.skiprows :
需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
(2) 存储
一般情况下直接把一个dataframe对象存储到csv文件即可。
df.to_csv(file_path,encoding=None, ...)
一般只需要设置好文件路径及名称即可,注意文件名称末尾需要加.csv
有时可能需要设置格式,为encoding=‘utf_8_sig’
2. excel文件
(1) 读取
pandas.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...)
- io:字符串,文件的路径对象。
- sheet_name:字符串列表或整数列表,默认为0。字符串用于工作表名称,整数用于零索引工作表位置,字符串列表或整数列表用于请求多个工作表,为None时获取所有工作表
- header:指定作为列名的行,默认0,即取第一行的值为列名。数据为列名行以下的数据;若数据不含列名,则设定 header = None。
- names:默认为None,定义表格的列名称
- index_col:指定列为索引列,默认None列(0索引)用作DataFrame的行标签。
(2) 存储
一般情况下直接把一个dataframe对象存储到xlsx文件即可。
df.to_excel(io, sheet_name='Sheet1', index_label=None, encoding=None, ...)
- io:字符串,文件的路径对象
- sheet_name:字符串列表或整数列表,字符串用于工作表名称
- encoding:编码格式,有时可能需要设置为encoding=‘utf_8_sig’
一般只需要设置好文件路径及名称即可,注意文件名称末尾需要加.xlsx