【分析篇】:Pandas像sql操作python 进行数据分析

前言:Python数据分析的基础在于对数据的提取,清洗,汇总,并思考整理发现数据规律的过程。以下模块是个人在数据分析常用模块,特此总结,便于查阅,构建数据分析体系。

数据源

import pandas as pd
import numpy as np

df = pd.DataFrame( {
       'ONE': [1.1,1.2,1.1,1.4,99],
       'TWO': [2.1,2.2,2.3,2.4,2.5],
       'THREE': [3.1,3.2,3.3,3.4,3.5]})

dfOne = pd.DataFrame({
                    'ONEs': [1.1,1.2,1.1,1.4,'字符'],
                   'TWOs': ['B1','B2','B3','B4','B5'],
                   'THREEs': ['C1','C2','C3','C4','C5'],
                    'FOURs': [20,40,60,80,100],
                    'TIMEs':[
                                  '2016-01-01 01:01:01',
                                  '2016-02-01 02:02:02',
                                  '2016-03-01 03:03:03',
                                  '2016-04-04 04:04:04',
                                  '2016-05-05 05:05:05']})

导入数据

import pandas as pd
from pandas import read_csv

df = read_table('D://PA//4.1//2.txt') : TXT
df = read_csv('D://PA//4.1//1.csv') :CSV(指定文件编码)
df = read_csv('D://PA//4.1//1.csv', encoding='UTF-8')
df = read_excel('D://PA//4.1//3.xlsx', sheetname='data'):EXCEL

df = pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
df = pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
df = pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据
df = pd.read_json(json_string):从JSON格式的字符串导入数据
df = pd.read_sql(query, connection_object):从SQL表/库导入数据

查看、检查数据

DataFrame较为常见,DataFrame的生成可通过读取纯文本、Json等数据来生成,亦可以通过Python对象来生成

  df.dtypes:数据框中的每一列的数据格式
  df.index:数据框的索引
  df.columns : 数据框中的列名
  df.head(n):查看DataFrame对象的前n行
  df.tail(n):查看DataFrame对象的最后n行
  df.shape():查看行数和列数
  http:// df.info() :查看索引、数据类型和内存信息

  df.describe():查看数值型列的汇总统计
  df.mean():返回所有列的均值
  df.corr():返回列与列之间的相关系数
  df.count():返回每一列中的非空值的个数
  df.max():返回每一列的最大值
  df.min():返回每一列的最小值
  df.median():返回每一列的中位数
  df.std():返回每一列的标准差
  s.value_counts(dropna=False):查看Series对象的唯一值和计数
  df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

select

  1. Select ONE,THREE from df where index >= 1 and index<= 3 order by index
df.loc[1:3,["ONE","THREE"]]
  1. Select * from df where index >= 1 and index < 3 order by index
df[1:3]
  1. Select ONE,THREE from df
df[['ONE', 'THREE']]

WHERE

Pandas实现where filter,较为常用的办法为df[df[colunm] boolean expr]
SELECT * from df where ONE > 1.1

df[df['ONE'] == 1.1]
df[df['ONE'] > 1.1]
df.query('ONE > 1.1')

AND

df[(df['ONE'] == 1.1) & (df['TWO'] == 2.1)]

OR

df[(df['ONE'] == 1.1) | (df['TWO'] == 2.1)]

IN

df[df['ONE'].isin([1.1,1.2])]

NOT

df[-(df['ONE'].isin([1.1,1.2]))]

LIKE
某列是否包含字符.str.contains('str')
select case when ONE like '字符' then -1 else 0 end from df

-df.ONE.str.contains('字符')

DISTINCT

保留重复元素中的第一个,删除重复元素的后面列
df.drop_duplicates(subset=['ONE'], keep='first', inplace=False)
1. subset,为选定的列做distinct,默认为所有列
2. keep,值选项{'first', 'last', False},保留重复元素中的第一个、最后一个,或全部删除;
3. inplace ,默认为False,返回一个新的dataframe;若为True,则返回去重后的原dataframe

select count(distinct ONE) from df

len(df.drop_duplicates(subset=['ONE'], keep='first', inplace=False))

GROUP

group一般会配合合计函数(Aggregate functions)使用,
比如:count、avg等。Pandas对合计函数的支持有限,有count和size函数实现SQL的count

  1. select ONE,count(*) from df group by ONE
df.groupby('ONE').size()
df.groupby('ONE').count()
  1. select THREE,sum(two) from df grouo by THREE
 df.groupby('THREE').agg({'TWO': np.sum})
  1. df.groupby('ONE').agg({'TWO': np.max})
select ONE,max(two) from df group by ONE
  1. select TWO,count(distinct one) fron df group by TWO
df.groupby('TWO').agg({'ONE': pd.Series.nunique})

AS

SQL中使用as修改列的别名,Pandas也支持这种修改:

  1. df.columns = ['A', 'B', 'C']
  2. df.rename(columns={'A': 'ONE', 'B': 'TWO', 'C': 'THREE'}, inplace=True)

JOIN

Pandas中join的实现也有两种
A. JOIN,横向连接 len(df) = len(df1) --> df + df1,按DataFrame的index进行join的df.join(dfOne, how='left')
B.按on指定的列做join。Pandas满足left、right、inner、full outer四种join方式

  1. select * from df as a left join dfOne as b on a.ONE = b.ONEs
    pd.merge(df, dfOne, how='left', left_on='ONE', right_on='ONEs')
  1. df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join

OEDER

Pandas中支持多列order,并可以调整不同列的升序/降序,有更高的排序自由度:

select * from df order by ONE desc,THREE
df.sort_values(['ONE', 'THREE'], ascending=[False, True])

REPALCE

  1. 全局替换
df.replace(to_replace=1.1, value=1.2, inplace=True)
  1. 局部替换
df.replace({'TWO': {2.1: 1.2, 2.4: 2.5}}, inplace=True)
  1. 指定条件替换
select ONE,THREE,CASE WHEN ONE = 1.2 THEN 2999 ELSE TWO END from df
df.loc[df.ONE == 1.2,'TWO'] = '2999'

自定义函数

  1. map(func),为Series的函数,DataFrame不能直接调用,需取列后再调用
select (ONE - 1) AS ONE from df 
df['ONE'].map(lambda x: x - 1)
  1. apply(func,axis=1) 对DataFrame中的每一行或则列应用函数func
df[['ONE', 'TWO']].apply(sum)
  1. applymap(func),为element-wise函数,对每一个元素做func操作
 df.applymap(lambda x: x.upper() if type(x) is str else x)

数据清洗

df.columns = ['a','b','c']:重命名列名
pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
df.dropna():删除所有包含空值的行
df.dropna(axis=1):删除所有包含空值的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
df.fillna(x):用x替换DataFrame对象中所有的空值
s.astype(float):将Series中的数据类型更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.rename(columns=lambda x: x + 1):批量更改列名
df.rename(columns={'old_name': 'new_ name'}):选择性更改列名
df.set_index('column_one'):更改索引列
df.rename(index=lambda x: x + 1):批量重命名索引
  1. 单字段的处理
 'Is Chicago Not Chicago?' 多个字符合并成一个字符
  >>>
  parts = ['Is', 'Chicago', 'Not', 'Chicago?']
  ' '.join(parts) 
  1. 数据缺失的处理,去除数据结构中值为空的数据 或者 数据零填充
newdf = df.dropna()
data = data.fillna(0)
  1. 数据类型转换,astype(str)转化为字符串
 select cast(ONEs as string) as ONEs from df
 >>>
 dfOne['ONEs'] = dfOne['ONEs'].astype(str)
 type(dfOne['ONEs'][0])
  1. 字符串提取,该列中第一个字符,字段的截取
 select SUBSTRING (ONEs,0,1) from df 
 SUBSTRING ( '源字符串' , '截取起始位置(含该位置上的字符)' , '截取长度' )  
 >>>
 bands = dfOne['ONEs'].str.slice(0, 1)
  1. 字段的拆分 相当于分列的功能
split(sep(用于分割的字符串),n(分割为多少列),expand(是否展开为数据框,默认FALSE))
>>>
newDF = dfOne['ONEs'].str.split('.', 1, True)
  1. 字段的合并,字段的合并
tel = dfOne['ONEs'] + dfOne['TWOs'] + dfOne['THREEs']

数据的标准化

  1. 最小-最大规范化
  scale = (df.TWO-df.TWO.min())/(df.TWO.max()-df.TWO.min())
  1. 零-均值规范化
  (df.TWO - df.TWO.mean())/df.TWO.std() 
  1. 小数定标规范化
  df.TWO/10**np.ceil(np.log10(df.TWO.abs().max())) 

数据的分组

根据数据分析的对象特征,按照一定的数值指标,把数据分析对象划分为不同的区间的部分来进行研究

cut 函数 :cut(series,bins,right=True,labels=NULL)
1.series-需要分组的数据
2. bins-分组的划分数据 right-分组的时候,右边是否闭合,labels-分组的自定义标签,可以不自定义

import pandas
dfOne['FOURs']
bins = [min(dfOne.FOURs)-1, 40, 60, 80, max(dfOne.FOURs)+1]
labels = [ '40以下', '40到60', '60到80','80以上次']
pandas.cut(dfOne['FOURs'], bins, right=False, labels=labels)

时间格式转换

from pandas import to_datetime
dfTWO = to_datetime(dfOne.TIMEs, format='%Y/%m/%d')
type(dfTWO[0])

日期的抽取

dfTWO.dt.year
dfTWO.dt.second
dfTWO.dt.minute
dfTWO.dt.hour
dfTWO.dt.day
dfTWO.dt.month
dfTWO.dt.weekday

数据保存

import pandas
Excel = pandas.ExcelWriter('D:\\code\\DataCenter\\email\\{0}.xlsx'.format(ExcelName))
DataFrame1.to_excel(Excel,'sheet1',index = False)
DataFrame2.to_excel(Excel,'sheet1',index = False)
Excel.save()

总结

最后引用数据海洋前辈一句话,‘数据分析是指将隐没在数据中的信息,进行集中、清洗、提炼并发现策略的过程’。独立优秀的数据提取和数据清洗能力是每个数据分析师的基本功,夯实基本功,跑的更远!

参考文献
ken , Treant

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容