pandas入門

pandas當中最重要的部分就是pandas提供的dataframe和series類型,能夠用來保存任何形式的數據,保存以後的結果相似於二維表的形式python

Series

series有兩個重要的參數是values和index正則表達式

In [76]: obj = pd.Series([4,5,6,7])

In [77]: obj
Out[77]:
0    4
1    5
2    6
3    7
dtype: int64

In [78]: obj.index
Out[78]: RangeIndex(start=0, stop=4, step=1)

In [79]: obj.values
Out[79]: array([4, 5, 6, 7], dtype=int64)

Series自己和索引都有一個index屬性,pandas有一個重要特徵就是其iloc選擇時是後包含的,好比df[:4,1]是指的0,1,2,3,4行的第1列數據庫

In [81]: obj.name = 'population'

In [82]: obj.index.name = 'state'

In [83]: obj
Out[83]:
state
0    4
1    5
2    6
3    7
Name: population, dtype: int64

DataFrame

DataFrame是一個表格型數據結構,同時有行索引和列索引,列的索引被稱爲columns,行索引被稱爲index編程

DataFrame的值仍然存儲在values屬性裏面json

更換列的順序只須要在建立dataframe的時候指定columns的值windows

其columns和index也能夠分別指定名字數組

index

index對象是不可更改的數據結構

reindex方法能夠改變原先index的順序,不過值也會跟着變,至關於換行的順序,其中的columns參數能夠從新索引列,其中的method能夠指定對於不存在的index的插值方法,ffill或pad表示向前填充,bfill和backfill表示向後填充app

drop

drop用於刪除某些行或某些列,刪除index行的時候只須要傳入index,刪除列的時候要傳入columns的名字和axis=1dom

applymap和apply

apply能夠應用函數到dataframe上,applymap能夠應用函數到元素集級別上

In [8]: df = pd.DataFrame(np.arange(0,1,0.1).reshape(2,5))

In [9]: df
Out[9]:
     0    1    2    3    4
0  0.0  0.1  0.2  0.3  0.4
1  0.5  0.6  0.7  0.8  0.9

In [12]: df.applymap(format)
Out[12]:
          0         1         2         3         4
0  0.000000  0.100000  0.200000  0.300000  0.400000
1  0.500000  0.600000  0.700000  0.800000  0.900000

排序

  1. sort_index:按照索引排序,傳入axis=1則按columns進行排序,傳入by參數則按照某列的值進行排序
  2. order:對Series進行排序

描述和彙總統計

方法 說明
count 非NA的值的數量
decribe 統計性描述,包括max,min,mena等
max,min 最大最小值
argmax, argmin 獲取到最大最小值的索引位置(整數)
quantile 計算樣本的分位數
sum 總和
median 中位數
mad 平均絕對離差
var、std 方差、標準差
skew 三階矩(樣本的偏度)
kurt 四階矩(樣本的峯度)
cumsum 累積和
cummin,cummax 樣本的累計最大值和累積最小值
cumprod(cum表示cumulative累積的,prod表示product乘積) 樣本的累計積
diff 一階差分
pct_change 計算百分數變化(好比股票漲跌計算)

初始化一個dataFrame,能夠read_csv從csv文件獲取,也能夠經過以下代碼:

import pandas as pd
df = pd.DataFrame(data, index, columns)

其中data是numpy中提供的數組或者是字典,index表示每行最左邊用於索引的列,columns表示每一列的名稱

要取出DataFrame的值,只須要df.column_name,用.加上列的名字就能夠了

查看數據

經過

  1. df.head:查看前五行數據,
  2. df.columns:查看列名
  3. df.values:查看矩陣的值
  4. df.describe():查看矩陣的統計描述,包括值的個數,平均值,標準差,最大最小值等等
  5. df.T:轉置矩陣
  6. df.sort_index(axis=1, ascending=False):經過列的大小值比較進行排序,axis=0時按照行的大小值進行排序
  7. df.sort_values(by='B')
  8. df.A或者df['A']:選取某一列的值
  9. df[0:3]:經過行號選取某幾行的值
  10. df['20101010':'20101030']:經過索引選取某些行的值
  11. df.loc[data[0]]:經過索引進行選取,表示的是loc
  12. df.iloc[1:3,1:4]:經過位置進行選取
  13. df.iloc[[1,3,4],[0,2]]:經過位置跳躍式選取,表示的是int loc,經過正數進行索引
  14. df[df.A > 0]:條件選擇

處理丟失數據

首先複製並修改一下df的索引和columns

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])

這樣由於第E列是沒有賦值的因此所有爲NAN

對於nan數據的處理有兩種方法,分別是dropnafillna

  1. df1.dropnan(how='any'):刪除全部值爲nan的行
  2. df1.fillnan(value=5):將全部nan的值填充爲5,能夠用字典的形式指定每一列的填充值

查找全部的nan,pd.isnull(df1)或者是pd.notnull(df)

對數據進行統計操做

  1. df.mean():默認求取的是每列的值,獲得一個行向量
  2. df.mean(1):按行求平均值,獲得一個列向量
  3. df.apply(lambda:x:x.max()-x.min()):apply應用一個函數到

DataFrame拼接

增長行:append,增長列:assign,df.assign(age=[1,2,3])

將list鏈接成DataFrame或者增長列,concat,參數爲axes,指定按行合併仍是按列合併;參數key,按行合併時能夠創建層次化索引,按列合併時做爲列的名稱。ignore_index=true,可讓合併以後的index是行號而沒有重複。

df = pd.DataFrame(np.random.randn(10, 4))
pieces = [df[:3], df[3:7], df[7:]]
pd.concat(pieces)

將兩個DataFrame按值鏈接在一塊兒(數據庫風格的合併),merge,參數爲on,表示按那一列進行合併,默認的how參數爲Inner,即內鏈接,若是要保留全部的值,能夠將how設置爲outer(外鏈接時等同於join)

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
In [79]: left
Out[79]: 
   key  lval
0  foo     1
1  foo     2
In [80]: right
Out[80]: 
   key  rval
0  foo     4
1  foo     5
In [81]: pd.merge(left, right, on='key')
Out[81]: 
   key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

將兩個DataFrame按行鏈接在一塊兒,Append

df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
s = df.iloc[3]
df.append(s, ignore_index=True)

按條件分組,groupby

df.groupby('A').sum()

對數據進行分類

df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
 df["grade"] = df["raw_grade"].astype("category")

對分類重命名:Series.cat.categories

df["grade"].cat.categories = ["very good", "good", "very bad"]

正則表達式條件斷定

operating_system = np.where(cframe['a'].str.contains('Windows'),'Windows','Not Windows')

這裏用np.whereDataFrame.str.contains('')來進行斷定一個字符串是否包含windows,若是包含則將其改成windows,不然將其改成'not windows'

數據規整

stack和unstack

stack:將行旋轉爲列

unstack:將列旋轉爲行,默認進行的是最內層的一列

>>> data=DataFrame(np.arange(6).reshape((2,3)),index=['ohio','colorado'],columns=['one','two','three'])
>>> data
          one  two  three
ohio        0    1      2
colorado    3    4      5
>>> data.index.name='state'
>>> data.columns.name='number'
>>> data
number    one  two  three
state                    
ohio        0    1      2
colorado    3    4      5
>>> data.stack()
state     number
ohio      one       0
          two       1
          three     2
colorado  one       3
          two       4
          three     5
#將列轉化爲行,獲得一個Series
#對於一個層次化索引的Series,能夠用unstack將其重排爲一個DataFrame
result.unstack(0)
state   ohio  colorado
number                
one        0         3
two        1         4
three      2         5
>>> result.unstack('state')
state   ohio  colorado
number                
one        0         3
two        1         4
three      2         5

pivot_table:數據透視表

好比在電影打分裏面,想獲得男女對不一樣電影的打分,能夠使用如下的函數

mean_ratings = data.pivot_table('rating', index='title', columns='gender', aggfunc='mean')

數據類型轉換

df.astype(int):將全部數據轉換爲int類型

數據排序

argsort:直接將值改成排序後的標號

Africa/Cairo                      20
Africa/Casablanca                 21
Africa/Ceuta                      92
Africa/Johannesburg               87
Africa/Lusaka                     53
# 右邊得出的是他們通過排序以後的序號

經過take函數能夠取出以argsort爲index的數據

將多個文件裏面的數據鏈接在一塊兒

用一個循環,每次用read_csv或者是read_table函數讀出一個dataframe,而後append到一個空list裏面,最後經過pd.concat(frame,ignore_index=True)鏈接成一個大的dataframe

years = range(1880,2011)
frame = []
for year in years:
    filename = 'yob{}.txt'.format(year)
    df = pd.read_csv(filename,names=['name','sex','births'])
    frame.append(df)
data = pd.concat(frame,ignore_index=True)
data.to_csv('birth_data.csv')

多列索引從新排序

swaplevel:交換索引
sortlevel:索引排序

set_index:和stack很像,將列值變成索引

reset_index:和unstack很像,將多級索引編程列值

數據讀入

讀入方法

  1. read_csv:用於讀取csv,默認分隔符爲逗號,須要修改默認分隔符用seperator參數,指定列名用header,無列名時用header=None,無index用index=None
  2. read_table:讀取txt文件,默認分隔符'\t',若是分隔符不止一個\t的空格,那麼用seperator='\s+'
  3. read_fwf:fixed-width file,讀取定寬文件,也就是沒有分隔符
  4. read_clipboard:讀取剪貼板中的數據,在將網頁轉換爲表格時頗有用
  • 若是隻想讀入前n行,能夠使用nrows參數,指定讀入的行數

讀入json的方法:

import json
#將json讀入爲python對象-字典
result = json.loads(obj)
#將python對象轉化爲json
asjson = json.dumps(result)

將長格式轉換爲寬格式

pivot函數:第一個參數表示行索引的列,第二個參數表示列索引的列

移除重複數據

duplicated():返回一個布爾型變量

drop_duplicates:移除重複行的DataFrame,默認保留第一個出現的值,若是要保存最後一個應該傳入take_last=True

對某列傳入一個函數

map

重命名軸索引

rename:獲得原始的軸索引的轉換版(好比首字母大寫或者是全大寫)

data.rename(index=str.title,columns=str.upper)

值分區

pd.cut(data, [0, 5, 15, 20], right=False):將數據按照[0,5),[5,15),[15,20)進行劃分

pd.qcut(data,4)將數據按分位數等分爲4份

隨機重排

np.random.permutation(x):若x是一個整數,那麼返回打亂的np.arange(x),而後經過df.take隨機選出這若干行;若x是一個數組,那麼返回一個打亂的數組的copy

r = np.random.permutation(len(df))[:5]
df_r = df.take(r)

計算啞變量

get_dummies

Series字符串處理

series.str.xxx

其中包含了一大堆字符串處理函數,好比:contains,findall

也能夠使用map和正則表達式來完成

相關文章
相關標籤/搜索