【分析篇】:Pandas像sql操作python 進行數(shù)據(jù)分析

前言:Python數(shù)據(jù)分析的基礎在于對數(shù)據(jù)的提取管跺,清洗,匯總禾进,并思考整理發(fā)現(xiàn)數(shù)據(jù)規(guī)律的過程豁跑。以下模塊是個人在數(shù)據(jù)分析常用模塊,特此總結泻云,便于查閱艇拍,構建數(shù)據(jù)分析體系。

數(shù)據(jù)源

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']})

導入數(shù)據(jù)

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():從你的粘貼板獲取內(nèi)容,并傳給read_table()
df = pd.DataFrame(dict):從字典對象導入數(shù)據(jù)婆瓜,Key是列名快集,Value是數(shù)據(jù)
df = pd.read_json(json_string):從JSON格式的字符串導入數(shù)據(jù)
df = pd.read_sql(query, connection_object):從SQL表/庫導入數(shù)據(jù)

查看、檢查數(shù)據(jù)

DataFrame較為常見廉白,DataFrame的生成可通過讀取純文本个初、Json等數(shù)據(jù)來生成,亦可以通過Python對象來生成

  df.dtypes:數(shù)據(jù)框中的每一列的數(shù)據(jù)格式
  df.index:數(shù)據(jù)框的索引
  df.columns : 數(shù)據(jù)框中的列名
  df.head(n):查看DataFrame對象的前n行
  df.tail(n):查看DataFrame對象的最后n行
  df.shape():查看行數(shù)和列數(shù)
  http:// df.info() :查看索引猴蹂、數(shù)據(jù)類型和內(nèi)存信息

  df.describe():查看數(shù)值型列的匯總統(tǒng)計
  df.mean():返回所有列的均值
  df.corr():返回列與列之間的相關系數(shù)
  df.count():返回每一列中的非空值的個數(shù)
  df.max():返回每一列的最大值
  df.min():返回每一列的最小值
  df.median():返回每一列的中位數(shù)
  df.std():返回每一列的標準差
  s.value_counts(dropna=False):查看Series對象的唯一值和計數(shù)
  df.apply(pd.Series.value_counts):查看DataFrame對象中每一列的唯一值和計數(shù)

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實現(xiàn)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一般會配合合計函數(shù)(Aggregate functions)使用凝果,
比如:count、avg等睦尽。Pandas對合計函數(shù)的支持有限器净,有count和size函數(shù)實現(xiàn)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的實現(xiàn)也有兩種
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的列執(zhí)行SQL形式的join

OEDER

Pandas中支持多列order浪慌,并可以調(diào)整不同列的升序/降序,有更高的排序自由度:

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'

自定義函數(shù)

  1. map(func)朴则,為Series的函數(shù)权纤,DataFrame不能直接調(diào)用,需取列后再調(diào)用
select (ONE - 1) AS ONE from df 
df['ONE'].map(lambda x: x - 1)
  1. apply(func,axis=1) 對DataFrame中的每一行或則列應用函數(shù)func
df[['ONE', 'TWO']].apply(sum)
  1. applymap(func)乌妒,為element-wise函數(shù)汹想,對每一個元素做func操作
 df.applymap(lambda x: x.upper() if type(x) is str else x)

數(shù)據(jù)清洗

df.columns = ['a','b','c']:重命名列名
pd.isnull():檢查DataFrame對象中的空值,并返回一個Boolean數(shù)組
pd.notnull():檢查DataFrame對象中的非空值撤蚊,并返回一個Boolean數(shù)組
df.dropna():刪除所有包含空值的行
df.dropna(axis=1):刪除所有包含空值的列
df.dropna(axis=1,thresh=n):刪除所有小于n個非空值的行
df.fillna(x):用x替換DataFrame對象中所有的空值
s.astype(float):將Series中的數(shù)據(jù)類型更改為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. 數(shù)據(jù)缺失的處理,去除數(shù)據(jù)結構中值為空的數(shù)據(jù) 或者 數(shù)據(jù)零填充
newdf = df.dropna()
data = data.fillna(0)
  1. 數(shù)據(jù)類型轉換,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(是否展開為數(shù)據(jù)框冗茸,默認FALSE))
>>>
newDF = dfOne['ONEs'].str.split('.', 1, True)
  1. 字段的合并,字段的合并
tel = dfOne['ONEs'] + dfOne['TWOs'] + dfOne['THREEs']

數(shù)據(jù)的標準化

  1. 最小-最大規(guī)范化
  scale = (df.TWO-df.TWO.min())/(df.TWO.max()-df.TWO.min())
  1. 零-均值規(guī)范化
  (df.TWO - df.TWO.mean())/df.TWO.std() 
  1. 小數(shù)定標規(guī)范化
  df.TWO/10**np.ceil(np.log10(df.TWO.abs().max())) 

數(shù)據(jù)的分組

根據(jù)數(shù)據(jù)分析的對象特征,按照一定的數(shù)值指標匹中,把數(shù)據(jù)分析對象劃分為不同的區(qū)間的部分來進行研究

cut 函數(shù) :cut(series,bins,right=True,labels=NULL)
1.series-需要分組的數(shù)據(jù)
2. bins-分組的劃分數(shù)據(jù) 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

數(shù)據(jù)保存

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()

總結

最后引用數(shù)據(jù)海洋前輩一句話,‘數(shù)據(jù)分析是指將隱沒在數(shù)據(jù)中的信息屎篱,進行集中服赎、清洗葵蒂、提煉并發(fā)現(xiàn)策略的過程’。獨立優(yōu)秀的數(shù)據(jù)提取和數(shù)據(jù)清洗能力是每個數(shù)據(jù)分析師的基本功重虑,夯實基本功践付,跑的更遠!

參考文獻
ken , Treant

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缺厉,一起剝皮案震驚了整個濱河市永高,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌提针,老刑警劉巖命爬,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辐脖,居然都是意外死亡饲宛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門嗜价,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艇抠,“玉大人,你說我怎么就攤上這事久锥〖矣伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵奴拦,是天一觀的道長媒鼓。 經(jīng)常有香客問我,道長错妖,這世上最難降的妖魔是什么绿鸣? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮暂氯,結果婚禮上潮模,老公的妹妹穿的比我還像新娘。我一直安慰自己痴施,他們只是感情好擎厢,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辣吃,像睡著了一般动遭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上神得,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天厘惦,我揣著相機與錄音,去河邊找鬼哩簿。 笑死宵蕉,一個胖子當著我的面吹牛酝静,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羡玛,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼别智,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稼稿?” 一聲冷哼從身側響起薄榛,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渺杉,沒想到半個月后蛇数,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡是越,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年耳舅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倚评。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浦徊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出天梧,到底是詐尸還是另有隱情盔性,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布呢岗,位于F島的核電站冕香,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏后豫。R本人自食惡果不足惜悉尾,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挫酿。 院中可真熱鬧构眯,春花似錦、人聲如沸早龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葱弟。三九已至壹店,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芝加,已是汗流浹背茫打。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人老赤。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像制市,于是被迫代替她去往敵國和親抬旺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容