利用python库 pandas完成数据分析
导读
- Pandas是一个强大的分析结构化数据的工具集,它的使用基础是Numpy(提供高性能的矩阵运算),用于数据挖掘和数据分析,同时也提供数据清洗功能。
- 本文收集了Python数据分析库Pandas及相关工具的日常使用方法,备查,持续更新中。
缩写说明
- df:任意的 Pandas DateFrame 对象
- s: 任意的Pandas Series对象
- 注: 有些属性方法df和s都可以使用。
推荐资源:
- pandas在线教程
- https://www.gairuo.com/p/pandas-tutorial
- 书籍《深入浅出Pandas:利用Python进行数据处理和分析》
一、导入数据
'先导库'
import pandas as pd
import numpy as np
imoport matplotlib.pyplot as plt
%matplotlib inline
#'从csv文件导入数据'
pd.read_csv('file.csv',names=['列名1','列名2',.]
#从限定分隔符的文本文件导入数据
pd.read_table(filename,header=0)
#Excel导入,指定sheet和表头
pd.read_excel('file.xlsx',sheet_name='表1',header=0)
#从SQL表/库导入数据(具体请看博主主页)
pd.read_sql(query,connect_object)
#从JSON格式的字符串导入数据
pd.read_json(json_string)
#解析URL、字符串或者HTML文件,抽取其中的tables表格。
pd.read_html(url)
#从你的粘贴板获取内容,并传给read_table()
pd.read_clipboard()
#从字典对象导入数据,key是列名,Values是数据
pd.DataFrame(dict)
#导入字符串
from io import StringIO
pd.read_csv(StringIO(web_data.text))
二、导出数据
#导出数据到csv文件
df.to_csv('filename.csv')
#导出数据到excel文件
df.to_excel('filename.xlsx',index=True)
#导出数据到SQL表
df.to_sql(table_name,connect_object)
#以Json格式导出数据到文本文件
df.to_json(filename)
#其他
df.to_html() #显示HTML代码
df.to_markdown() # 显示markdown代码
df.to_sting() #显示格式化字符
df.to_latex(index=False) #LaTex tabular ,longtable
df.to_dict('split') #字典,格式 list/series/records/index
df.to_clipboard(sep=',',index=False) #存入系统剪贴板
#将两个表格输出到一个excel文件里面,导出到多个sheet
writer=pd.ExcelWriter('nes.xlsx')
df_1.to_excel(writer,sheet_name='第一个',index=False)
df_2.to_excel(writer,sheet_name='第二个',index=False)
writer.save() #必须运行writer.save(),不然不能输出到本地
#写法2
with pd.ExcelWriter('new.xlsx') as writer:
df1.to_excel(writer,sheet_name='第一个')
df2.to_excel(writer,sheet_name='第二个')
#用xlsxwriter 导出支持合并单元格、颜色、图标等定制功能
创建测试对象
#创建20行5列的随机数组成的DataFrame对象
pd.DataFrame(np.random.rand(20,5))
#从可迭代对象my_list 创建一个Series对象
pd.Series(my_list)
#增加一个日期索引
df.index=pd.date_range('1900/1/30',periods=df.shape[0])
#创建随机数据集
df.pt.util.testing.makeDataFrame()
#创建随机日期索引数据集
df=pd.util.testing.makePeriodFrame()
df=pd.util.testing.makeTimeDateFrame()
#创建随机混合类型数据集
df=pd.util.testig.makeMixeDataFrame()
查看、检查、统计、属性
df.head(n) #查看DateFrame对象前n行
df.tail(n) #查看DateFrame对象最后n行
df.sample(n) #查看n个样本,随机
df.shape #查看行数和列数
df.info() #摘要包括所有列的列表及其数据类型以及每列中非空值的数量
df.describe() #查看数值型的汇总统计
df.dtypes #查看个字段类型
df.axes #显示数据行和列名
df.mean() #返回所有列的均值
df.mean(1) #返回所有行的均值 下同
df.corr() #返回列和列之间的相关系数
df.count() #返回每一列中的非空值的个数
df.max() #返回每一列的最大值
df.min() #返回每一列的最小值
df.median() #返回每一列的中位数
df.std() #返回每一列的标准差
df.var() #方差
s.mode() #众数
s.cumprod() #累积连乘 ,累乘
df.cumsum(axis=0) #累加
s.nunique() #去重数量,不同值的量
df.idxmax() #每列最大的值的索引名
df.idmin() #最小
df.columns #显示所有列名
df.team.unique() #显示列中的不重复值
#查看Series对象的唯一值和计数,计数占比:normalize=True
s.value_counts(drona=False)
#查看DataFrame对象中每一列的唯一值和计数
df.apply(pd.Series.value_counts)
df.duplicated() #重复行
df.drop_option() #删除重复行
#set_option,reset_option,describe_option 设置显示要求
pd.get_option() #设置行列最大显示数量,None 为不限制
pd.options.display.max_rows=None
pd.options.display.max_columns=None
df.col.argmin() #最大值【最小值.argmax()】 所在位置的自动索引
df.col.idxmin() #最大值[最小值.idxmax()]所在位置的定义索引
#累计统计
ds.cunsum() #前边所有值之和
ds.cumprod() #前边所有值之积
ds.cummax() #前边所有值的最大值
ds.cummin() #前边所有值的最小值
#窗口计算(滚动计算)
ds.rolling(x).sum() #依次计算相邻x个元素的和
ds.rolling(x).mean() #依次计算相邻x个元素的算数平均
ds.rolling(x).val() #依次计算相邻x个元素的方差
ds.rolling(x).std() #依次计算相邻x个元素的方差
ds.rolling(x).min() #依次计算相邻x个元素的最小值
ds.rolling(x).max() #依次计算相邻x个元素的最大值。
缺失值的处理
df.info() #摘要包括所有列的列表及其数据类型以及每列中非空值的数量
数据清洗
df.columns=['a','b','c'] #重命名列
df.columns=df.columns.str.replace(' ','_')#列名空格换下划线
data.loc[:, 'a'] # 等价于data.iloc[:, 0]
data.loc[:, ['a', 'b']] # 等价于data.iloc[:, [0, 1]]
df.drop(['name'], axis=1) #删除列
df.drop([0,10] ,axis=0) #删除行
del df['name'] #删除列
df.dropna() #删除所有包含空值的行
df.dropna(axis=0,subset=["toy"]) #删除‘toy’列为空值得行
df.dropna(axis=1) #删除所有包含空值的列
df.dropna(axis=1,thresh=n) #删除所有小于n个非空值的行。
df.fillna(x) #用x替换DataFrame对象中所有的空值
df.fillna(value={'prov':'未知'}) #指定列的空值替换为指定内容
s.astype(float) #将Series中的数据类型更改为float类型。
df.index.astype('datetime64[ns]') #转换为时间格式
s.replace(1,'one') #用‘one’代替所有等于1的值
s.replace([1,3],['one',three']) #批量更改列名
df.set_index('column_one') #更改索引列
df.rename(index=lambda x:x+1) #批量重命名索引
df.reset_index() #重置索引,用于groupby分组之后的字段名更新
数据处理
df.round(2) #全部
df.round({'A':1,'c':2})
#多条件查询
df[ df['team'] == 'A') & (df['Q1']>80) & df.utype.isin(['老客','老访客'])]
df[df.name.str.contains('张')] #包含字符
DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’) #将按照字段排序数据,默认升序
#应用函数
df.apply(np.max,axis=1) #对DataFrame中的每一行应用函数np.max
df.insert(3, '两倍',df['值']*2) #插入数据,在第三列加入[两倍]列
样式显示
**# https://pbpython.com/styling-pandas.html
df['per_cost'] = df['per_cost'].map('{:,.2f}%'.format) # 显示%比形式
# 指定列表(值大于0)加背景色
df.style.applymap(lambda x: 'background-color: grey' if x>0 else '',
subset=pd.IndexSlice[:, ['B', 'C']])
# 最大值最小值加背景色
df.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39')
df.style.format('{:.2%}', subset=pd.IndexSlice[:, ['B']]) # 显示百分号
# 指定各列的样式
format_dict = {'sum':'${0:,.0f}',
'date': '{:%Y-%m}',
'pct_of_total': '{:.2%}'
'c': str.upper}
# 一次性样式设置
(df.style.format(format_dict) # 多种样式形式
.hide_index()
# 指定列按颜色深度表示值大小, cmap 为 matplotlib colormap
.background_gradient(subset=['sum_num'], cmap='BuGn')
# 表格内作横向 bar 代表值大小
.bar(color='#FFA07A', vmin=100_000, subset=['sum'], align='zero')
# 表格内作横向 bar 代表值大小
.bar(color='lightgreen', vmin=0, subset=['pct_of_total'], align='zero')
# 下降(小于0)为红色, 上升为绿色
.bar(color=['#ffe4e4','#bbf9ce'], vmin=0, vmax=1, subset=['增长率'], align='zero')
# 给样式表格起个名字
.set_caption('2018 Sales Performance')
.hide_index())
# 按条件给整行加背景色(样式)
def background_color(row):
if row.pv_num >= 10000:
return ['background-color: red'] * len(row)
elif row.pv_num >= 100:
return ['background-color: yellow'] * len(row)
return [''] * len(row)
# 使用
df.style.apply(background_color, axis=1)**
Jupyter notebooks问题
# jupyter notebooks plt 图表配置
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (15.0, 8.0) # 固定显示大小
plt.rcParams['font.family'] = ['sans-serif'] # 显示中文问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文问题
# 输出单行全部变量
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'
# jupyter notebooks 页面自适应宽度
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
# 背景白色 <style>#notebook_panel {background: #ffffff;}</style>
# jupyter notebooks 嵌入页面内容
from IPython.display import IFrame
IFrame('https://arxiv.org/pdf/1406.2661.pdf', width=800, height=450)
# Markdown 一个 cell 不支持多张粘贴图片
# 一个文件打印打开只显示一张图片问题解决
# /site-packages/notebook/static/notebook/js/main.min.js var key 处
# 33502、33504 行
key = utils.uuid().slice(2,6)+encodeURIandParens(blob.name);
key = utils.uuid().slice(2,6)+Object.keys(that.attachments).length;
# https://github.com/ihnorton/notebook/commit/55687c2dc08817da587977cb6f19f8cc0103bab1
# 多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'
# 执行 shell 命令: ! <命令语句>
# 在线可视化工具
https://plot.ly/create
三、可视化
- 创建组合图
df = pd.DataFrame({"revenue":[57,68,63,71,72,90,80,62,59,51,47,52],
"advertising":[2.1,1.9,2.7,3.0,3.6,3.2,2.7,2.4,1.8,1.6,1.3,1.9],
"month":range(12)})
ax = df.plot.bar("month", "revenue", color = "green")
df.plot.line("month", "advertising", secondary_y = True, ax = ax)
ax.set_xlim((-1,12));
!](https://img-blog.csdnimg.cn/7054729c7d2a4f339cc3a07e99ac09e8.png)