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一样做数据分析(二)的更多相关文章

  1. 【Python实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  2. 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  3. Pandas:让你像写SQL一样做数据分析

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  4. 【Pandas教程】像写SQL一样用Pandas~

    写在最前 Python在数据分析领域有三个必须需要熟悉的库,分别是pandas,numpy和matplotlib,如果排个优先级的话,我推荐先学pandas. numpy主要用于数组和矩阵的运算,一般 ...

  5. Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析

    Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...

  6. Java开发者写SQL时常犯的10个错误

        首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS ...

  7. Python利用pandas处理Excel数据的应用

    Python利用pandas处理Excel数据的应用   最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...

  8. python实战:用70行代码写了一个山炮计算器!

    python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...

  9. python实战博客

    2018-10-31 更新Logging日志记录以及异常捕获 感谢廖大教程.Python实战 直接在闲置的服务器上开发.阿里云Centos 6.8 64位. 1 搭建开发环境 Python 环境是Py ...

随机推荐

  1. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind

    这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...

  2. Android+jsp +html 文件上传案例 已测试 成功通过

    我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...

  3. http长轮询&短轮询

    http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...

  4. C#线程入门---转载

    C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中 ...

  5. [Window Title] (没有登录) [Content] ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 [OK]

    重启Oracle服务

  6. DevOps是云计算时代的开发与运营

    DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和质量保障(QA)部门之间的沟通.协作与整合.[1] 它 ...

  7. 性能计数器与profiler的组合性能诊断

    性能计数器和sql profiler都是常用的性能诊断工具和优化工具,最近和群友聊天发现很多人竟然不知道这两个可以“组合”使用,所以这篇算是一篇扫盲贴吧. 两种工具简述 通过计数器可以收集两部分内容: ...

  8. Entity Framework 基础知识走马观花

    本文目录: 一.EF中的edmx文件探秘 二.EF中的代理模式探秘 三.EF中的延迟加载与即时加载 一.EF中的edmx文件 1.1 emdx文件本质:一个XML文件 (1)通过选择以XML方式打开e ...

  9. Atitit 教育与培训学校 的计划策划 v4 qc18

    Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...

  10. Oracle 创建普通用户,并赋予权限

    采用sys or system / manager as sysdba; 连接数据库. 创建普通用户konglin: create user konglin identified by pwd_ora ...