1. 程式人生 > >pandas學習筆記01

pandas學習筆記01

pandas的基礎使用
從 CSV 檔案中讀取資料

這個資料集是一個列表,蒙特利爾的 7 個不同的自行車道上每天有多少人。

 

broken_df = pd.read_csv('../data/bikes.csv')

 

# 檢視前三行

broken_df[:3]

 

 

你可以看到這完全損壞了。 read_csv  擁有一堆選項能夠讓我們修復它,在這裡我們:

 

將列分隔符改成 ;

將編碼改為 latin1(預設為 utf-8)

解析Date列中的日期

告訴它我們的日期將日放在前面,而不是月

將索引設定為 Date

 

fixed_df = pd.read_csv('../data/bikes.csv',  sep=' ; ' ,  encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')

fixed_df[:3]

 

從SQL庫讀取資料

read_sql需要2個引數: SELECT語句, 資料庫連線物件。

 

import sqlite3

con = sqlite3.connect("../data/weather_2012.sqlite")

df = pd.read_sql("SELECT * from weather_2012 LIMIT 3", con)

選擇一列,並繪製

當你讀取 CSV 時,你會得到一種稱為 DataFrame  的物件,它由行和列組成。 您

從資料框架中獲取列的方式與從字典中獲取元素的方式相同。

fixed_df['Berri 1'].plot()

直接輸出表物件

complaints = pd.read_csv('../data/311-service-requests.csv')

當你檢視一個大型資料框架,而不是顯示資料框架的內容,它會顯示一個摘要。這包括所有列,以及每列中有多少非空值。

如直接輸出 complaints

查詢多列,多行,子集

檢視每列的型別:

df.dtypes

 

查詢多列,列索引必須要用中括號擴起來

complaints[['Complaint Type', 'Borough']][:10]

 

查詢多行,這裡的ix索引標籤函式必須是中括號[]

student.ix[[0,2,4,5,7]]

 

查詢多列,通過ix索引標籤查詢指定的列

student.ix[ : , ['Name','Height','Weight']]

 

查詢出所有12歲以上的女生姓名、身高和體重

student[(student['Sex']=='F') & (student['Age']>12)][['Name','Height','Weight']]

檢視某列中各個種類出現的次數

complaints['Complaint Type'].value_counts()

檢視某列中屬於某個種類的資料

為了得到噪音投訴,我們需要找到 Complaint Type  列為 Noise -Street/Sidewalk  的行。 我會告訴你如何做,然後解釋發生了什麼。

 

noise_complaints = complaints[complaints['Complaint Type'] == "Noise - Street/Sidewalk"]

將多個條件與 & 運算子組合

is_noise = complaints['Complaint Type'] == "Noise - Street/Sidewalk"

in_brooklyn = complaints['Borough'] == "BROOKLYN"

 

complaints[is_noise & in_brooklyn][:5]

轉為numpy陣列型別

pd.Series([1,2,3]).values

常用函式

1)對字串切片操作

requests['某列'] = requests['某列'].str.slice(0,5)

 

2)為每列新增字首

df.add_prefix('mean_')

排序

1)將一列排序

Table[[‘某列’]].sort()

2)將多列按照某一列排序

table[['列1', '列2', '列3']].sort('列1')

3)值排序一般使用sort_values()

Student.sort_values(by = [‘sex’, ‘age’])

解析Unix時間戳

pandas 中的時間戳解析的神奇部分是 numpy  datetime  已經儲存為 Unix 時間戳。 所以我們需要做的是告訴 pandas 這些整數實際上是資料時間,它不需要做任何轉換。

我們需要首先將這些轉換為整數,然後我們可以使用 pd.to_datetime函式將我們的整數時間戳轉換為 datetimes。這是一個常量時間操作,我們實際上並不改變任何資料,只是改變了 Pandas 如何看待它。

 

popcon['atime'] = popcon['atime'].astype(int)

 

popcon['atime'] = pd.to_datetime(popcon['atime'], unit='s')

統計分析函式

d1.count() #非空元素計算

d1.min() #最小值

d1.max() #最大值

d1.idxmin() #最小值的位置,類似於R中的which.min函式

d1.idxmax() #最大值的位置,類似於R中的which.max函式

d1.quantile(0.1) #10%分位數

d1.sum() #求和

d1.mean() #均值

d1.median() #中位數

d1.mode() #眾數

d1.var() #方差

d1.std() #標準差

d1.mad() #平均絕對偏差

d1.skew() #偏度

d1.kurt() #峰度

d1.describe() #一次性輸出多個描述性統計指標

 

關於相關係數的計算可以呼叫pearson方法或kendell方法或spearman方法,預設使用pearson方法。計算的是任意兩列的相關係數。

df.corr()

 

如果只想關注某一個變數與其餘變數的相關係數的話,可以使用corrwith,如下方只關心x1與其餘變數的相關係數:

df.corrwith(df['x1'])

 

數值型變數間的協方差矩陣

df.cov()

groupby
1)選擇一個列或者一組列

l  對一張表直接進行分組操作,而不做其他聚合,顯示結果如下:

Out[29]: df.groupby('key1')

<pandas.core.groupby.DataFrameGroupBy object at 0x000002BB1364A4A8>

如何顯示:

(1)可以對分組進行迭代顯示:

for name, group in df.groupby('key1'):

    print(name)

print(group)

>>> 

a

      data1     data2 key1 key2

0 -0.204708  1.393406    a  one

1  0.478943  0.092908    a  two

4  1.965781  1.246435    a  one

-------

b

      data1     data2 key1 key2

2 -0.519439  0.281746    b  one

3 -0.555730  0.769023    b  two

-------

(2)轉化為字典顯示

dict(list(df.groupby('key1')))

>>> 

{'a': 

          data1     data2         key1   key2

      0    -0.204708     1.393406    a       one

1    0.478943       0.092908    a      two

4    1.965781      1.246435    a      one ,

'b':  

       data1     data2           key1   key2

      2     -0.519439   0.281746     b    one

      3     -0.555730   0.769023     b    two }

 

l  按每列的資料型別分組

grouped = df.groupby(df.dtypes, axis=1)

dict(list(grouped))

{dtype('float64'):       data1     data2

 0 -0.204708  1.393406

 1  0.478943  0.092908

 2 -0.519439  0.281746

 3 -0.555730  0.769023

 4  1.965781  1.246435 ,

dtype('O'):               key1  key2

 0    a  one

 1    a  two

 2    b  one

                            3    b  two

 4    a  one  }

2)通過字典或series進行分組

假如一張表的列名:columns=['a', 'b', 'c', 'd', 'e']

定義一個字典:mapping = {'a': 'red',  'b': 'red',  'c': 'blue',  'd': 'blue',  'e': 'red',  'f' : 'orange'}

by_column = people.groupby(mapping, axis=1)

by_column.sum()

>>> 

           blue       red

Joe     0.503905  1.063885

Steve   1.297183  -1.553778

Wes    -1.021228  -1.116829

Jim     0.524712  1.770545

Travis  -4.230992  -2.405455

 

map_series = Series(mapping)

people.groupby(map_series, axis=1).count()

3)按行進行分組

本質上還是按列進行聚合,即按照索引進行聚合,同按列進行分組

 

key=['ss','kk','kk','ss','ss']  #給定index分組標記

data.groupby(key).mean()  #mean是按key做分組的列均值  groupby(key)預設axis=0

4)資料的聚合

(1) quantile

df=

      data1     data2   key1 key2

0  -0.204708  1.393406    a  one

1  0.478943   0.092908    a  two

2  -0.519439  0.281746    b  one

3  -0.555730  0.769023    b  two

4  1.965781   1.246435    a  one

grouped = df.groupby('key1')

grouped['data1'].quantile(0.9)

(2)agg()

grouped = df.groupby('key1')

def peak_to_peak(arr):

    return arr.max() - arr.min()

grouped.agg(peak_to_peak)

>>> 

         data1     data2

key1                   

a     2.170488  1.300498

b     0.036292  0.487276

Tip:

agg()和apply()區別

agg函式內呼叫的函式只能對分組進行聚合使用,apply的應用更廣泛

 

agg()使用的多種形式:

grouped_pct.agg(['mean', 'std', peak_to_peak])

 

grouped_pct.agg([('foo', 'mean'), ('bar', np.std)])  #給計算結果一個別名

 

functions = ['count', 'mean', 'max']

result = grouped['tip_pct', 'total_bill'].agg(functions)  #列表形式

 

ftuples = [('Durchschnitt', 'mean'), ('Abweichung', np.var)]

grouped['tip_pct', 'total_bill'].agg(ftuples)  #元組形式

 

grouped.agg({'tip' : np.max, 'size' : 'sum'})  #字典形式

 

grouped.agg({'tip_pct' : ['min', 'max', 'mean',  'std'], 'size' : 'sum'})  #混合形式

(3)transform()

我們經常在groupby之後使用aggregate , filter 或 apply來彙總資料,transform則不對資料進行聚合,它會在對應行的位置生成函式值。

舉例:

data=

       a  b  c  d   e

li      1  2  3  4   5

chen   2  1  1  2   2

wang   1  2  3  4  5

zhao   2  1  1  2   2

qian   1  2  3  4   5

 

l  使用一般函式,會對資料進行聚合

key=['ss','kk','kk','ss','ss']  #給定index分組標記

print(data.groupby(key).mean())  #mean是按key做分組的列均值

>>> 

           a         b         c         d    e

kk     1.500000  1.500000  2.000000  3.000000  3.5

ss      1.333333  1.666667  2.333333  3.333333  4.0

 

l  使用transform(),不會對資料進行聚合

data.groupby(key).transform(np.mean)

#data裡每個位置元素取對應分組列的均值

>>> 

             a         b         c         d    e

li        1.333333  1.666667  2.333333  3.333333  4.0

chen     1.500000  1.500000  2.000000  3.000000  3.5

wang    1.500000  1.500000  2.000000  3.000000  3.5

zhao     1.333333  1.666667  2.333333  3.333333  4.0

qian     1.333333  1.666667  2.333333  3.333333  4.0

5)資料透視表

假設我想要根據sex和smoker計算分組平均數(pivot_table的預設聚合型別),並將sex和smoker放到行上:

# 方法一:使用groupby

tips.groupby(['sex', 'smoker']).mean()

# 方法二:使用pivot_table

tips.pivot_table(row=['sex', 'smoker'])

兩種方法是一樣的

 

現在假設我們只想聚合tip_pct和size,而且想根據day進行分組。我將smoker放到列上,把day放到行上:

tips.pivot_table(values=['tip_pct', 'size'], index=['sex', 'day'], columns='smoker')

 

要使用其他的聚合函式,將其傳給引數aggfunc即可。例如,使用count或len可以得到有關分組大小的交叉表:

tips.pivot_table('tip_pct',  index=['sex', 'smoker'],  columns='day',  aggfunc=len,  margins=True)

6)交叉表

交叉表crosstab()是一種特殊的pivot_table(),專用於計算分組頻率

下面兩種方法是一樣的

data.pivot_table(index=['Gender'], columns='Handedness', aggfunc=len, margins=True)

# 方法二:用crosstab

pd.crosstab(data.Gender, data.Handedness, margins=True)