利用python库 pandas完成数据分析(持续更新中~)

利用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)
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值