使用python在本地电脑上快速处理数据


Posted in Python onJune 22, 2017

大数据一般是在“云”上玩的,但“云”都是要钱的,而且数据上上下下的也比较麻烦。所以,在本地电脑上快速处理数据的技能还是要的。

pandas

在比赛中学到的一个工具,本地可以在亿级别的数据上进行聚合等操作。内部的数据包括:
• Series:一维数组,每个元素有一个标签
• DataFrame:二维表格,可以看做Series的集合
• Panel:三维数据

数据的初始化

我们可以通过构造函数来初始化,从下面的代码中可以想象得到数据是样子:

from pandas import Series, DataFrame

s = Series(data=[1, 2, 3], index=['a', 'b', 'c'])

df = DataFrame(
  data=[
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ],
  index=['i1', 'i2', 'i3'],
  columns=['c1', 'c2', 'c3']
)

如果源数据是格式比较好的CSV(或者是自己加工生成的中间数据),可以直接读取:
df = pandas.read_csv("../volume.csv", header=0)

数据的更新

更新结构

在定义完成之后可以对行、列进行增减(增减数据、修改结构):
• 增加列: • df.insert(3, 'new_column', [4, 7, 10])
• df['c4'] = [4, 7, 10]

• 删除列 • df.pop('c1')
• df = df.drop('c1', axis=1)

• 增加行:一般不要动态的增加行,据说新能不高 • df.loc['i4'] = [10, 11, 12]
• df.loc['i4'] = {'c1': 10, 'c2': 11, 'c3': 12}

• 删除行: • df = df.drop('i1', axis=0)

更新数据

我们可以精确修改单个位置的值:
• df['c1']['i1'] = 77
• df.ix[1, 2] = 66

合并数据

数据很多时候分布在不同的DataFrame中,要使用需要将他们进行合并,第一种方式是concat(基础方法):

import pandas as pd

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
          'B': ['B0', 'B1', 'B2', 'B3'],
          'C': ['C0', 'C1', 'C2', 'C3'],
          'D': ['D0', 'D1', 'D2', 'D3']},
          index=[0, 1, 2, 3])

df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
          'B': ['B4', 'B5', 'B6', 'B7'],
          'C': ['C4', 'C5', 'C6', 'C7'],
          'D': ['D4', 'D5', 'D6', 'D7']},
          index=[4, 5, 6, 7])

result = pd.concat([df1, df2])

合并完的结果为:

A  B  C  D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A4 B4 C4 D4
5 A5 B5 C5 D5
6 A6 B6 C6 D6
7 A7 B7 C7 D7

其参数含义如下:
• objs :合并的数据(Series、DataFrame)
• axis :合并轴方向,行(0)、列(1)
• join :关联类型(inner、outer)
• join_axes :结果行,eg: pd.concat([df1, df2], axis=1, join_axes=[pd.Int64Index([1, 2, 3])])
• ignore_index :是否忽略objs中传入的索引
• keys :来自不同表的index,每个表一个(ignore_index=True时不管用)
• levels :不同层次的索引
• names :不同层次的索引的名字
• verify_integrity :检查是否包含重复项(有一定的代价)
• copy :是否赋值数据

另一个相对简化点的操作是append(简化版,好像没啥特别的):
result = df1.append(df2)

接着来看重点方法merge(将两个表的数据进行融合):

import pandas as pd

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
           'A': ['A0', 'A1', 'A2', 'A3'],
           'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
           'C': ['C0', 'C1', 'C2', 'C3'],
           'D': ['D0', 'D1', 'D2', 'D3']})

result = pd.merge(left, right, on='key')

print(result)

结果为(注意观察与concat不一样的地方): 

A  B key  C  D
0 A0 B0 K0 C0 D0
1 A1 B1 K1 C1 D1
2 A2 B2 K2 C2 D2
3 A3 B3 K3 C3 D3

方法的参数有:
• left、right :将要进行关联的两个表
• how :关联方式(left、right、inner、outer)
• on :实现关联的列,不传应该是找相同列名
• left_on、right_on :分别为left、right的关联列,在列名不同时使用
• left_index、right_index :是否用索引来关联
• sort :排序
• suffixes :后缀
• copy :是否复制数据

对应的简化版本为join方法:

import pandas as pd

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
           'B': ['B0', 'B1', 'B2', 'B3']},
          index=['K0', 'K1', 'K2', 'K3'])

right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
           'D': ['D0', 'D1', 'D2', 'D3']},
           index=['K0', 'K1', 'K2', 'K3'])

result = left.join(right)

print(result)

输出为:

A  B  C  D
K0 A0 B0 C0 D0
K1 A1 B1 C1 D1
K2 A2 B2 C2 D2
K3 A3 B3 C3 D3

数据的查询和分析

基本查询

精确查看单个位置数据的方法:
• df['c1']['i1']
• df.loc['i1']['c1'] (先行后列)
• df.iloc[1] (下标操作)
• df.ix['i1'][1] 或 df.ix[0, 2] (随意使用下标或名称)

通过切片的操作批量取出数据:
• df.loc['i1':'i2', ['c1', 'c2']]
• df.iloc[1:3, [1, 2]]
• df.ix[1:3, 0:2]

查看某行或某列:
• 行: df.loc['i1']
• 列: df['c1']

分组

分组(GroupBy)是最最基本的一个分析手段,看个例子:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
          'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
          'C': np.random.randn(8),
          'D': np.random.randn(8)})

result = df.groupby(['A'])

print(result.get_group('foo'))

其他分组形式:
• df.groupby('A')
• df.groupby(['A', 'B'])
• df.groupby(group_func, axis=1)
• df.groupby(level=0)
• df.groupby([pd.Grouper(level=0), 'A'])

可以对各组进行遍历:

for name, group in result:
  print(name)
  print(group)

对分组的结果可以过滤:

df.groupby('A').B.filter(lambda x : len(x) > 1)

进一步对各个分组进行计算(结果太直观,就不写了):
• df.groupby(['A', 'B']).sum()
• df.groupby(['A', 'B']).sum().reset_index()
• df.groupby(['A', 'B']).aggregate(np.sum)
• df.groupby(['A', 'B']).agg(np.sum)
• df.groupby(['A', 'B']).agg([np.sum, np.mean])
• df.groupby(['A', 'B']).agg([np.sum, np.mean]).rename(columns={'sum': 's', 'mean': 'm'})
• df.groupby(['A', 'B']).agg({'C': np.sum, 'D': np.mean})
• df.groupby(['A', 'B']).agg({'C': 'sum', 'D': 'mean'})

利用transform(类似的还有apply)可以对各个分组分别计算:

import pandas as pd
import numpy as np

df = pd.DataFrame(data={
  'A': [1, 1, 3],
  'B': [4, 5, 6],
  'C': [7, np.nan, 9]})

print(df.groupby('A')['B'].transform(lambda x : x - x.mean()))

输出结果为:

0  -0.5
1  0.5
2  0.0
Name: B, dtype: float64

类似的,可以在分组上使用窗口函数:
• rolling
• resample
• expanding

条件过滤

用一些常用的构造方式,可以有类似SQL的开发效率��:
• tips[tips['time'] == 'Dinner'].head(5)
• tips[(tips['time'] == 'Dinner') & (tips['tip'] > 5.00)]
• tips[(tips['size'] >= 5) | (tips['total_bill'] > 45)]
• frame[frame['col2'].isnull()]
• frame[frame['col1'].notnull()]

最后,如果想图形化看在PyCharm里面需要搞个 plt.show() (其他的IDE并不清楚)。

numpy

比较早接触的numpy,总体上来看处理数据比自带类型方便些:
• np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
• np.array((5, 6, 7, 8))

主要集中在数组、矩阵的处理上!是很多工具的基础。

Python 相关文章推荐
Python单例模式的两种实现方法
Aug 14 Python
python+pyqt实现右下角弹出框
Oct 26 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
Oct 17 Python
python远程邮件控制电脑升级版
May 23 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
pycharm新建Vue项目的方法步骤(图文)
Mar 04 Python
python2和python3哪个使用率高
Jun 23 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
Dec 09 Python
详解Flask开发技巧之异常处理
Jun 15 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 #Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 #Python
Python查询IP地址归属完整代码
Jun 21 #Python
Python批量查询域名是否被注册过
Jun 21 #Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 #Python
Python编程实战之Oracle数据库操作示例
Jun 21 #Python
Python获取SQLite查询结果表列名的方法
Jun 21 #Python
You might like
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
PHP如何实现跨域
2016/05/30 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
jquery调用wcf并展示出数据的方法
2011/07/07 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python实用日期时间处理方法汇总
2015/05/09 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python 支付整合开发包的实现
2019/01/23 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
python super()函数的基本使用
2020/09/10 Python
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
大学生简历中个人的自我评价
2013/10/06 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
建筑横幅标语
2014/10/09 职场文书
夫妻吵架保证书
2015/05/08 职场文书
vue实现简单数据双向绑定
2021/04/28 Vue.js