【Python实战】Pandas:让你像写SQL一样做数据分析(二)
1. 引言
前一篇介绍了Pandas实现简单的SQL操作,本篇中将主要介绍一些相对复杂一点的操作。为了方便后面实操,先给出一份简化版的设备统计数据:
0 android NLL 387546520 2099457911
0 ios NLL 52877990 916421755
1 android 魅族 8995958 120369597
1 android 酷派 9915906 200818172
1 android 三星 16500493 718969514
1 android 小米 23933856 290787590
1 android 华为 26706736 641907761
1 ios 苹果 52877990 916421755
2 android 小米-小米4 2786675 55376581
2 android 魅族-m2-note 4642112 130984205
2 android OPPO-A31 4893428 62976997
2 ios 苹果-iPhone-6s 5728609 99948716
其中,第一列表示维度组合编号,第二列表示操作系统类型,第三列为维度值(NLL表示缺失,即第一行、第二行表示操作系统的统计,其余表示厂商或机型),第三列、第四列分别表示UV、PV;且字段之间为\t分隔。读取该文件为DataFrame:
import pandas as pd
df = pd.read_csv(path, names=['id', 'os', 'dim', 'uv', 'pv'], sep='\t')
2. 实战
Add
在原dataframe上,增加一行数据;可通过dataframe的append函数来追加:
import numpy as np
row_df = pd.DataFrame(np.array([['2', 'ios', '苹果-iPad 4', 3287509, 32891811]]), columns=['id', 'os', 'dim', 'uv', 'pv'])
df = df.append(row_df, ignore_index=True)
增加一列数据,则比较简单:
df['time'] = '2016-07-19'
To Dict
关于android、ios的PV、UV的dict:
def where(df, column_name, id_value):
df = df[df[column_name] == id_value]
return df
def to_dict(df):
"""
{"pv" or "uv" -> {"os": os_value}}
:return: dict
"""
df = where(df, 'id', 0)
df_dict = df.set_index('os')[['uv', 'pv']].to_dict()
return df_dict
Top
group某列后的top值,比如,android、ios的UV top 2的厂商:
def group_top(df, group_col, sort_col, top_n):
"""
get top(`sort_col`) after group by `group_col`
:param df: dataframe
:param group_col: string, column name
:param sort_col: string, column name
:param top_n: int
:return: dataframe
"""
return df.assign(rn=df.sort_values([sort_col], ascending=False)
.groupby(group_col)
.cumcount() + 1) \
.query('rn < ' + str(top_n + 1)) \
.sort_values([group_col, 'rn'])
全局top值加上group某列后的top值,并有去重:
def top(df, group_col, sort_col, top_n):
"""overall top and group top"""
all_top_df = df.nlargest(top_n, columns=sort_col)
grouped_top_df = group_top(df, group_col, sort_col, top_n)
grouped_top_df = grouped_top_df.ix[:, 0:-1]
result_df = pd.concat([all_top_df, grouped_top_df]).drop_duplicates()
return result_df
排序编号
对某列排序后并编号,相当于给出排序名次。比如,对UV的排序编号:
df['rank'] = df['uv'].rank(method='first', ascending=False).apply(lambda x: int(x))
Left Join
Pandas的left join对NULL的列没有指定默认值,下面给出简单的实现:
def left_join(left, right, on, right_col, default_value):
df = pd.merge(left, right, how='left', on=on)
df[right_col] = df[right_col].map(lambda x: default_value if pd.isnull(x) else x)
return df
自定义
对某一列做较为复杂的自定义操作,比如,厂商的UV占比:
def percentage(part, whole):
return round(100*float(part)/float(whole), 2)
os_dict = to_dict(df)
all_uv = sum(os_dict['uv'].values())
df = where(df, 'id', 1)
df['per'] = df.apply(lambda r: percentage(r['uv'], all_uv), axis=1)
重复值
某列的重复值的行:
duplicate = df.duplicated(subset=columns, keep=False)
写MySQL
Pandas的to_sql函数支持Dataframe直接写MySQL数据库。在公司开发时,常常会有办公网与研发网是不通的,Python的sshtunnel模块提供ssh通道,便于入库debug。
import MySQLdb
from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(('porxy host', port),
ssh_password='os passwd',
ssh_username='os user name',
remote_bind_address=('mysql host', 3306)) as server:
conn = MySQLdb.connect(host="127.0.0.1", user="mysql user name", passwd="mysql passwd",
db="db name", port=server.local_bind_port, charset='utf8')
df.to_sql(name='tb name', con=conn, flavor='mysql', if_exists='append', index=False)
【Python实战】Pandas:让你像写SQL一样做数据分析(二)的更多相关文章
- 【Python实战】Pandas:让你像写SQL一样做数据分析(一)
1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...
- 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)
1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...
- Pandas:让你像写SQL一样做数据分析
1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...
- 【Pandas教程】像写SQL一样用Pandas~
写在最前 Python在数据分析领域有三个必须需要熟悉的库,分别是pandas,numpy和matplotlib,如果排个优先级的话,我推荐先学pandas. numpy主要用于数组和矩阵的运算,一般 ...
- Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析
Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...
- Java开发者写SQL时常犯的10个错误
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS ...
- Python利用pandas处理Excel数据的应用
Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...
- python实战:用70行代码写了一个山炮计算器!
python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...
- python实战博客
2018-10-31 更新Logging日志记录以及异常捕获 感谢廖大教程.Python实战 直接在闲置的服务器上开发.阿里云Centos 6.8 64位. 1 搭建开发环境 Python 环境是Py ...
随机推荐
- C#程序代码分析(第三周)
刚开始看到这段程序,都不知道是什么东西,问过室友才知道是C#程序:但对C#一点都不了解,最基本的项目建设都不会,在室友的帮助下,以及在网上搜了一些资料,勉强算是完成了此次作业吧. using Syst ...
- 浅谈Android应用保护(零):出发点和背景
近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文 ...
- 玩转Asp.net MVC 的八个扩展点
MVC模型以低耦合.可重用.可维护性高等众多优点已逐渐代替了WebForm模型.能够灵活使用MVC提供的扩展点可以达到事半功倍的效果,另一方面Asp.net MVC优秀的设计和高质量的代码也值得我们去 ...
- 从Facebook跑来阿里的赵海平大叔,你要干啥?
赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...
- 简单一招实现json数据可视化
开发一个内部功能时碰到的需求,要把json数据在页面上展示出来,平时浏览器会安装jsonView这样的扩展来看json数据,但是程序要用到的话该怎么办呢?今天在网上搜索的时候,发现了这个小技巧,分享一 ...
- 提供程序不支持 DatabaseExists
如果Oracle CodeFirst模式下要用EFProviderWrapperToolkit,那么会报告以下错误: 提供程序不支持 DatabaseExists. 这个错误是因为Oracle Cod ...
- C语言 · 回文数
问题描述 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数. 输出格式 按从小到大的顺序输出满足条件的四位十进制数. 方案一: int main(){ int ...
- JavaScript学习笔记之数值
JavaScript内部,所有数字都是以64位浮点数形式储存,即使整数也是如此.(整数也是通过64浮点数的形式来存储的) 所以,1+1.0=2:且1===1.0的 浮点数不是精确的值,所以涉及小数的比 ...
- crossplatfrom---electron入门教程
1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...
- Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx 1.1. 数据库的类型,网状,层次,树形数据库,kv数据库.oodb2 1.2. Er模型2 1.3. Sql2 ...