pandas有时候操作很不方便,也有可能是我不熟练吧,反正就是各种别扭。下面是我写的一个简单的json数据操作工具,能够完成简单的数据分析工作,后续会不断完善的

# coding=utf-8
import logging
import sys
import ujson as json logging.basicConfig(
stream=sys.stdout,
format="%(asctime)s [%(module)s][%(funcName)s][%(lineno)s] \n%(levelname)s: [%(message)s]\n", )
log = logging.getLogger(__name__) """
'asctime',
'created',
'filename',
'funcName',
'levelname',
'levelno',
'lineno',
'module',
'msecs',
'message',
'name',
'pathname',
'process',
'processName',
'relativeCreated',
'thread',
'threadName'
""" class pipe(object):
def __init__(self, data=None):
self._d = data def pipe(self, func):
self._d = func(self._d)
return self def result(self):
return self._d class Field(object):
def __init__(self, data=None):
self._d = data or {} def to_dict(self):
return self._d def set(self, **kwargs):
self._d.update(kwargs)
return self def __setitem__(self, i, y):
self._d[i] = y def __getitem__(self, y):
if isinstance(y, (str, unicode)):
return self._d.get(y) if isinstance(y, list):
return [self._d.get(i) for i in y] def __delitem__(self, y):
if not isinstance(y, list):
y = [y] for i in y:
try:
del self._d[i]
except:
pass def drop(self, *y):
del self[y]
return self class KTable(object):
def __init__(self, data=None, header=None):
data = data or []
self._d = {}
self._header = header
self.append(data) def __set(self, i, y=None):
if isinstance(i, int):
try:
self._d[i].set(**y)
except:
self._d[i] = Field(y)
else:
k, v = i
self._d[k][v] = y def __setitem__(self, i, y=None):
self.__set(i, y=y) def set(self, i, y=None):
self.__set(i, y=y)
return self def append(self, y=None):
if not isinstance(y, list):
y = [y] for i in y:
try:
self[max(self._d.keys()) + 1] = i
except:
self[0] = i
return self def map(self, func, *sequence_1):
if sequence_1 and isinstance(sequence_1[0], KTable):
sequence_1 = [i._d.itervalues() for i in sequence_1] map(func, self._d.itervalues(), *sequence_1)
return self def group_by(self, label, func=None): k_label = self._d[0].to_dict().keys() if self._d else []
if not k_label:
return self label = label if isinstance(label, list) else [label]
[k_label.remove(i) for i in label] _d = {}
for k in self._d.itervalues():
_k = [k[i] for i in label]
_v = {i: k[i] for i in k_label}
try:
_d[tuple(_k)].append(_v)
except:
_d[tuple(_k)] = [_v] _res = []
for i, v in _d.iteritems():
try:
_v = dict(map(lambda x, y: (x, y), label, list(i)))
_v.update(func(KTable(v)))
_res.append(_v)
except Exception, e:
log.error("{},{}".format(i, e.message))
return KTable(_res) def sort_by(self, label=None):
if type(label) == str:
return KTable(sorted(self.to_dict(), key=lambda x: x[label])) return self def echo(self, y=None):
if not y:
print self
else:
print self[y]
return self def distinct(self):
return KTable([dict(i) for i in {tuple(v.to_dict().items()) for v in self._d.itervalues()}]) def drop(self, k):
if getattr(k, '__call__'):
for i in self._d.iterkeys():
if k(self._d[i]):
del self._d[i]
else:
if not isinstance(k, list):
k = [k] if isinstance(k[0], str):
for i in self._d.iterkeys():
del self._d[i][k]
else:
for i in self._d.iterkeys():
del self._d[i] return self def min(self):
pass def max(self):
pass def mean(self):
pass def __get(self, y):
if isinstance(y, (int, str)):
y = [y] if isinstance(y, tuple):
y = list(set((self._d.get(0) or Field()).to_dict().keys()) - set(y)) if isinstance(y[0], int):
return [(self._d.get(i) or Field()).to_dict() for i in y]
else:
self._header = y
return [{i: v[i] for i in y} for v in self._d.itervalues()] def __getitem__(self, y):
if callable(y):
_d = []
for i in self._d.iterkeys():
_v = self._d[i]
_v['_i'] = i
if not y(_v):
continue _d.append(_v.to_dict())
__v = KTable(_d, header=self._header)
self._header = None
return __v if not isinstance(y, (str, int)) and len(y) == 2 and isinstance(y[0], int) and isinstance(y[1], str):
_d = self._d.get(y[0]) if not _d:
return None return _d[y[1]] __v = KTable(self.__get(y), header=self._header)
self._header = None
return __v @property
def header(self):
return self._header @header.setter
def header(self, header=None):
self._header = header def pipe(self, func):
return func(self) def __len__(self):
return len(self._d.keys()) def to_json(self):
return json.dumps([v.to_dict() for v in self._d.itervalues()]) def to_dict(self):
return [v.to_dict() for v in self._d.itervalues()] def __str__(self):
print "--**-- data --**--"
if not self._header:
for v in self._d.itervalues():
print v.to_dict()
else:
print u"".join(["%-35s" % i for i in self._header])
_kk = self._d.keys()
_kk.sort()
for v in _kk:
print u"".join(["{" + "{}".format(i) + ":<30}" for i in self._header]).format(**self._d[v].to_dict())
print "--**-- end --**--"
return "" if __name__ == '__main__':
tk = KTable([{
"a": 1,
"b": 2,
"c": "rr"
}, {
"a": 1,
"b": 2,
"c": "rrr"
}, {
"a": 1,
"b": 3,
"c": "rr"
}, {
"a": 2,
"b": 3,
"c": "rrr"
}]) print tk['a'].to_dict()
t = tk.map(lambda x: x.set(dd=0))
t.header = None
print t.map(lambda x: x.set(dd=0))
print t.map(
lambda x: x.set(w=x['c'], dd=x['dd'] + 1))[('a', 'b')][['c', 'dd']] # 用元组取值为exclude,list为include
print t.map(lambda x, y: x.set(w=x['a'] + y['a'], dd=x['dd'] + 1), t) print t[1]
print t[lambda x: x['a'] == 1]
print t[lambda x: x['_i'] == 1]
print t['c'].distinct()
a = t[['a', 'b']].distinct().to_dict()[0]
print t[lambda x: x['a'] == 1 and x['b'] == 3][0, 'a'] print t.group_by('a', lambda x: {
"min": 1
}).sort_by('a')

pandas协助工具的更多相关文章

  1. Pandas 计算工具介绍

    # 导入相关库 import numpy as np import pandas as pd 统计函数 最常见的计算工具莫过于一些统计函数了.首先构建一个包含了用户年龄与收入的 DataFrame i ...

  2. python数据分析学习(1)pandas一维工具Series讲解

    目录 一:pandas数据结构介绍   python是数据分析的主要工具,它包含的数据结构和数据处理工具的设计让python在数据分析领域变得十分快捷.它以NumPy为基础,并对于需要类似 for循环 ...

  3. Pandas IO工具

    Pandas I/O API是一套像pd.read_csv()一样返回Pandas对象的顶级读取器函数. 读取文本文件(或平面文件)的两个主要功能是read_csv()和read_table().它们 ...

  4. smbmnt - 装载 SMB 文件系统的协助工具

    总览 smbmnt mount-point [ -s share ] [ -r ] [ -u uid ] [ -g gid ] [ -f mask ] [ -d mask ] 描述 smbmnt 用于 ...

  5. 移动应用开发过程中需要哪些IOS APP工具

    虽说如今要开发一款IOS app应用软件已经不是什么难事,app开发技术已经发展成熟,所以要制作一款适用于苹果IOS智能操作系统的app软件也挺容易的了.不过对于开发者来说,可以通过一些app工具来更 ...

  6. GitHub上整理的一些工具

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  7. GitHub上整理的一些工具[转载]

    Source:http://segmentfault.com/q/1010000002404545 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddi ...

  8. GitHub 开源工具整理

    技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 ...

  9. GitHub上整理的一些工具,求补充

    http://segmentfault.com/q/1010000002404545 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MS ...

随机推荐

  1. 安装oracle11g时遇到环境不满足最低要求

    在安装oracle11g时出现问题:INS-13001环境不满足最低要求 解决方法:找到下载解压后的文件,依次打开以下文件路径:Oracle11g\database\stage\cvu, 在cvu文件 ...

  2. iOS 类似美团或饿了么评价中的星星评分控件

    1.做的好几个项目都用到了评分控件,可以用来展示评分,也可以用来写评分,图片和间距大小都可以定制,之前就已经简单封装了一个,现在把它分享出来,有需要的拿去用. 2.下面是展示截图:   image.p ...

  3. ABAP术语-qRFC-Monitor

    qRFC-Monitor 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/10/1098543.html Central monitoring ...

  4. linux系统环境下的静态库和动态库的制作

    linux系统下的应用编程需要系统提供的库文件,包括静态库或动态库.不管是静态库还是动态库,都是编译好的二进制文件.在我们编译程序时要链接的目标文件,静态库是链接的时候直接编译到程序里,和程序成为一体 ...

  5. 新人成长之入门Vue.js弹窗Dialog介绍(二)

    前言 在上一篇博文中介绍了Vue.js的常用指令,今天总结归纳一下弹窗Dialog的使用,弹窗经常被使用在一些表单的增删改查啊,或者弹出一些提示信息等等,在保留当前页面状态的情况下,告知用户并承载相关 ...

  6. CentOS7 LNMP+phpmyadmin环境搭建(二、LNMP环境搭建)

    上一篇博客我们在虚拟机上安装了centos7,接下来,就开始安装lnmp环境吧. 还是跟之前一样,进入命令行后,先使用su命令切换到root权限. 首先配置防火墙  CentOS 7.0默认使用的是f ...

  7. python兵器谱之re模块与正则表达式

    一.正则表达式 ·1.正则表达式的应用场景: 应用特有的规则,给我需要的符合规则的字符串,在字符串中只有符合条件的才会被匹配和从大段的字符串中提取需要的数据 ·匹配字符串的规则: ·1.字符串:用户输 ...

  8. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  9. 最小生成树——Kruscal(克鲁斯卡尔算法)

    一.核心思想 ​ 将输入的数据由小到大进行排序,再使用并查集算法(传送门)将每个点连接起来,同时求和. ​ 个人认为这个算法比较偏向暴力,有些题可能会超时. 二.例题 洛谷-P3366 题目地址:ht ...

  10. C语言实例解析精粹学习笔记——19

    实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...