pandas(進階操作)-- 處理非數值型資料 -- 資料分析三劍客(核心)

zylyehuo發表於2023-10-02

部落格地址:https://www.cnblogs.com/zylyehuo/

開發環境

  • anaconda
    • 整合環境:整合好了資料分析和機器學習中所需要的全部環境
    • 安裝目錄不可以有中文和特殊符號
  • jupyter
    • anaconda提供的一個基於瀏覽器的視覺化開發工具
import numpy as np
import pandas as pd
from pandas import DataFrame

替換操作

  • 替換操作可以同步作用於Series和DataFrame中
  • 單值替換
    • 普通替換: 替換所有符合要求的元素:to_replace=15,value='e'
    • 按列指定單值替換: to_replace={列標籤:替換值} value='value'
  • 多值替換
    • 列表替換: to_replace=[] value=[]
    • 字典替換(推薦) to_replace=
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df

df.replace(to_replace=0,value='Zero')

df.replace(to_replace={10:'Ten'})

# 將指定列的元素進行替換to_replase={列索引:被替換的值}
df.replace(to_replace={3:0},value='Zero')

對映操作

  • 概念:建立一個對映關係列表,把values元素和一個特定的標籤或者字串繫結(給一個元素值提供不同的表現形式)
  • 建立一個df,兩列分別是姓名和薪資,然後給其名字起對應的英文名
dic = {
    'name':['張三','李四','張三'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
df

# 對映關係表
dic = {
    '張三':'tom',
    '李四':'jack'
}
# map是Series的方法,只能被Series呼叫
df['e_name'] = df['name'].map(dic)
df

運算工具

  • 超過3000部分的錢繳納50%的稅,計算每個人的稅後薪資
# 該函式是我們指定的一個運演算法則
def after_sal(s):#計算s對應的稅後薪資
    return s - (s-3000)*0.5
# map是Series的方法,只能被Series呼叫    
df['after_sal'] = df['salary'].map(after_sal)  # 可以將df['salary']這個Series中每一個元素(薪資)作為引數傳遞給s
df

排序實現的隨機抽樣

  • take()
  • np.random.permutation()
df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
df

# 生成亂序的隨機序列
np.random.permutation(10)
array([8, 9, 6, 2, 5, 3, 1, 0, 7, 4])
# 將原始資料打亂
df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)

df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50]
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)[0:50].head()

資料的分類處理

  • 資料分類處理的核心:
    • groupby()函式
    • groups屬性檢視分組情況
df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})
df

想要對水果的種類進行分析

df.groupby(by='item')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000290D4BAA910>

檢視詳細的分組情況

df.groupby(by='item').groups
{'Apple': [0, 5], 'Banana': [1, 3], 'Orange': [2, 4]}

分組聚合

計算出每一種水果的平均價格

df.groupby(by='item')['price'].mean()
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

計算每一種顏色對應水果的平均重量

df.groupby(by='color')['weight'].mean()
color
green     31.333333
red       12.000000
yellow    35.000000
Name: weight, dtype: float64
dic = df.groupby(by='color')['weight'].mean().to_dict()
dic
{'green': 31.333333333333332, 'red': 12.0, 'yellow': 35.0}

將計算出的平均重量彙總到源資料

df['mean_w'] = df['color'].map(dic)
df

高階資料聚合

  • 使用groupby分組後,也可以使用transform和apply提供自定義函式實現更多的運算
  • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
  • transform和apply都會進行運算,在transform或者apply中傳入函式即可
  • transform和apply也可以傳入一個lambda表示式
def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum / len(s)
df.groupby(by='item')['price'].transform(my_mean)
0    3.00
1    2.75
2    3.50
3    2.75
4    3.50
5    3.00
Name: price, dtype: float64
df.groupby(by='item')['price'].apply(my_mean)
item
Apple     3.00
Banana    2.75
Orange    3.50
Name: price, dtype: float64

資料載入

  • 讀取type-.txt檔案資料
df = pd.read_csv('./data/type-.txt')
df

df.shape
(2, 1)

將檔案中每一個詞作為元素存放在DataFrame中

pd.read_csv('./data/type-.txt',header=None,sep='-')

讀取資料庫中的資料

連線資料庫,獲取連線物件

import sqlite3 as sqlite3
conn = sqlite3.connect('./data/weather_2012.sqlite')

讀取庫表中的資料值

sql_df=pd.read_sql('select * from weather_2012',conn)
sql_df

將一個df中的資料值寫入儲存到db

df.to_sql('sql_data456',conn)
2

透視表

  • 透視表是一種可以對資料動態排布並且分類彙總的表格格式。或許大多數人都在Excel使用過資料透視表,也體會到它的強大功能,而在pandas中它被稱作pivot_table。
  • 透視表的優點:
    • 靈活性高,可以隨意定製你的分析計算要求
    • 脈絡清晰易於理解資料
    • 操作性強,報表神器
import pandas as pd
import numpy as np
df = pd.read_csv('./data/透視表-籃球賽.csv',encoding='utf8')
df

pivot_table有四個最重要的引數index、values、columns、aggfunc

index引數:分類彙總的分類條件

  • 每個pivot_table必須擁有一個index。如果想檢視哈登對陣每個隊伍的得分則需要對每一個隊進行分類並計算其各類得分的平均值:
  • 想看看哈登對陣同一對手在不同主客場下的資料,分類條件為對手和主客場
df.pivot_table(index=['對手','主客場'])

values引數:需要對計算的資料進行篩選

  • 如果我們只需要哈登在主客場和不同勝負情況下的得分、籃板與助攻三項資料
df.pivot_table(index=['主客場','勝負'],values=['得分','籃板','助攻'])

Aggfunc引數:設定我們對資料聚合時進行的函式操作

  • 當我們未設定aggfunc時,它預設aggfunc='mean'計算均值。
  • 還想獲得james harden在主客場和不同勝負情況下的總得分、總籃板、總助攻時
df.pivot_table(index=['主客場','勝負'],values=['得分','籃板','助攻'],aggfunc='sum')

Columns:可以設定列層次欄位

  • 對values欄位進行分類
# 獲取所有隊主客場的總得分
df.pivot_table(index='主客場',values='得分',aggfunc='sum')

# 獲取每個隊主客場的總得分(在總得分的基礎上又進行了對手的分類)
df.pivot_table(index='主客場',values='得分',columns='對手',aggfunc='sum',fill_value=0)

交叉表

  • 是一種用於計算分組的特殊透檢視,對資料進行彙總
  • pd.crosstab(index,colums)
    • index:分組資料,交叉表的行索引
    • columns:交叉表的列索引
import pandas as pd
from pandas import DataFrame
df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],
               'age':[15,23,25,17,35,57,24,31,22],
               'smoke':[True,False,False,True,True,False,False,True,False],
               'height':[168,179,181,166,173,178,188,190,160]})
df

求出各個性別抽菸的人數

pd.crosstab(df.smoke,df.sex)

求出各個年齡段抽菸人情況

pd.crosstab(df.age,df.smoke)

相關文章