1. 程式人生 > 其它 >python資料分析-類似sql用法

python資料分析-類似sql用法

——python sql
pandas在資料處理上有著豐富且高效的函式,我們把資料清理、整理好後,只是一張原始的DataFrame。python也能像SQL一樣或者excel裡面的voolkup一樣將資料進行合併,也能像excel裡面的透視表或者sql
group by一樣進行資料透視組合,也能像excel的查詢功能或者sql裡面的where功能進行資料篩選。

文章目錄

  • python類似sql where用法或excel查詢用法
  • python類似sql Group by分組用法
  • python類似sql join關聯用法
  • python類似sql order排序用法
  • python類似sql Distinct去重用法

python類似sql where用法或excel查詢用法

python 類似where用法中的 col=a、col<>a、col=a and col =b、col=a or col=b、col
in(a,b,c)、col not in(a,b,c)

語法 描述
df[‘col’]==‘Female’ 查詢df表col列中內容等於Female的內容 = 用法
df[‘col’]!=11 查詢df表col列中內容不等於11的內容 <> 用法
df[df[‘col’]==‘Female’] 查詢df表中col列單個條件等於Female的內容,並返回整張表所有列
df[(df[‘col’]==‘Female’)&(df[‘col2’]>0)]

查詢df表中col列等於Female,並且col2列大於0的內容,返回整張表所有列 and 用法
df[‘col’].between(a,b) | col列中a=2,b=8,返回2-8之間的數
df[(df[‘col’]>=10)|(df[‘col2’]<50)] |
查詢df表中col列小於等於10或者col2列小於50的內容,返回整張表所有列 or 用法
df[df[‘col’].isin([21.01, 23.68, 24.59])] | 查詢col列中包含指定值的內容,返回整張表所有列 in


用法
df[-df[‘col’].isin([11,63])] | 查詢col列中不包含多個值的內容,返回整張表 not in 用法

程式碼案例

    import pandas as pd
    data={'a':[1,2,3,4,3,2,6],
          'b':[43,23,52,23,11,63,83],
          'c':['true','fales','true','true','fales','fales','true']}
    data=pd.DataFrame(data)#建立一個df表
    Out[33]: 
       a   b      c
    0  1  43   true
    1  2  23  fales
    2  3  52   true
    3  4  23   true
    4  3  11  fales
    5  2  63  fales
    6  6  83   true
    #查詢b列內容大於等於30的所有列
    data[data['b']>=30] 
    Out[34]: 
       a   b      c
    0  1  43   true
    2  3  52   true
    5  2  63  fales
    6  6  83   true
     #查詢b類大於等於30並且a列小於5的所有列
    data[(data['b']>=30)&(data['a']<5)]
    Out[35]: 
       a   b      c
    0  1  43   true
    2  3  52   true
    5  2  63  fales
    #查詢b列不包含11和63的所有列,不用`-`號代表包含
    data[-data['b'].isin([11,63])]
    Out[36]: 
       a   b      c
    0  1  43   true
    1  2  23  fales
    2  3  52   true
    3  4  23   true
    6  6  83   true

python類似sql Group by分組用法

group一般會配合合計函式(Aggregate
functions)使用,比如:count、avg等。Pandas對合計函式的支援有限,有count和size函式實現SQL的count

語法 描述
df.groupby(‘sex’).size() 對欄位sex單列進行分組,只展示sex欄位計數
df.groupby(‘sex’)[‘tip’].count() 對欄位sex單列進行分組,計算tip欄位計數
df.groupby(‘sex’).count() 根據欄位sex單列進行分組計算,展示所有欄位計數
df.groupby(‘sex’).agg({‘tip’:np.max,‘total_bill’:np.sum})

根據欄位sex進行分組,分別求tip最大值,欄位total_bill求和值
df.groupby(‘tip’).agg({‘sex’: pd.Series.nunique}) | 去重tip欄位並依sex欄位進行計數
pd.pivot_table(df,index=col1,columns=col2,values=[col2,col3], aggfunc=max) |
建立一個按列col1進行分組,並計算col2和col3的最大值的資料透視表

python中的group也支援迭代常用於迴圈對整個df進行分組然後再進行加工

語法 描述
for x in df.groupby(‘col’): 迴圈語句對df表按col列進行分組,返回多個tuple,x[1]選取返回的df資料
for x in df.groupby([‘col’,‘col2’]):

迴圈語句對df表按col、col2列進行分組,返回多個tuple,x[1]選取返回的df資料

程式碼案例

  • 直接groupby計算
    #按c列分組分別計算a,b列的和
    data.groupby('c').sum() 
    
    Out[37]: 
            a    b
    c             
    fales   7   97
    true   14  201
    
    #按c列分組只求a列的和
    data.groupby('c')['a'].sum()
    Out[38]: 
    c
    fales     7
    true     14
  • for迴圈groupby迭代
    #將data按c列分組,重新生成兩個單獨的df
    for x in data.groupby('c'):
        print(x[1])
    
    Out[40]:
       a   b      c
    1  2  23  fales
    4  3  11  fales
    5  2  63  fales
       a   b     c
    0  1  43  true
    2  3  52  true
    3  4  23  true
    6  6  83  true
    

python類似sql join關聯用法

語法 描述
pd.merge(a,b,how=‘left’,left_on=‘sex’,right_on=‘sex’) on指定的列做join

Pandas滿足left、right、inner、outer四種join方
pd.merge(a,b,how=‘left’,on=[‘a1’,‘b1’,‘c1’]) |
on=指定需要相同的多列,至少三列列進行join同時滿足匹配
pd.merge(a,b,left_index=True,right_index=True) | 根據索引進行合併left_index or
right_index,解決一對多boolean型別

程式碼案例

    data1={'d':[7,44,1,44,31,42,3],
          'b':[43,23,52,23,11,63,83],
          'c':['true','fales','true','true','fales','fales','true']}
    data1=pd.DataFrame(data1)#再創一個表命名為data1,data表在最前面
    
    Out[52]: 
        d   b      c
    0   7  43   true
    1  44  23  fales
    2   1  52   true
    3  44  23   true
    4  31  11  fales
    5  42  63  fales
    6   3  83   true
    pd.merge(data,data1,how='inner',left_on='a',right_on='d')
    #取data表a列與data1表d列相同的交集部分
    Out[55]: 
       a  b_x    c_x  d  b_y   c_y
    0  1   43   true  1   52  true
    1  3   52   true  3   83  true
    2  3   11  fales  3   83  true

python類似sql order排序用法

語法 描述
df.sort_values([‘col’], ascending=False) 按col列排序,ascending=False為 降序
df.sort_values([‘col’], ascending=True) 按col列排序,ascending=True為 升序
df.sort_index(ascending=False) 根據索引進行排序,ascending=False為 降序

程式碼案例

    data.sort_values(['a'],ascending=[True])對a列進行排序
    
    Out[56]: 
       a   b      c
    0  1  43   true
    1  2  23  fales
    5  2  63  fales
    2  3  52   true
    4  3  11  fales
    3  4  23   true
    6  6  83   true

python類似sql Distinct去重用法

語法 描述
df.drop_duplicates(subset=[‘col’], keep=‘first’, inplace=True)

根據某列對dataframe進行去重

包含引數

引數 描述
subset 為選定的列做distinct,預設為所有列
keep 值選項{‘first’, ‘last’, False},保留重複元素中的第一個、最後一個,或全部刪除
inplace 預設為False,返回一個新的dataframe;若為True,則返回去重後的原dataframe

程式碼案例

    data.drop_duplicates(subset=['a'],keep='first',inplace=True)
    #將data表a列中重複的去掉,並替換原表
    Out[59]: 
       a   b      c
    0  1  43   true
    1  2  23  fales
    2  3  52   true
    3  4  23   true
    6  6  83   true