pandas當中最重要的部分就是pandas提供的dataframe和series類型,能夠用來保存任何形式的數據,保存以後的結果相似於二維表的形式python
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是一個表格型數據結構,同時有行索引和列索引,列的索引被稱爲columns,行索引被稱爲index編程
DataFrame的值仍然存儲在values屬性裏面json
更換列的順序只須要在建立dataframe的時候指定columns的值windows
其columns和index也能夠分別指定名字數組
index對象是不可更改的數據結構
reindex方法能夠改變原先index的順序,不過值也會跟着變,至關於換行的順序,其中的columns參數能夠從新索引列,其中的method能夠指定對於不存在的index的插值方法,ffill或pad表示向前填充,bfill和backfill表示向後填充app
drop用於刪除某些行或某些列,刪除index行的時候只須要傳入index,刪除列的時候要傳入columns的名字和axis=1dom
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
方法 | 說明 |
---|---|
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,用.
加上列的名字就能夠了
經過
df.head
:查看前五行數據,df.columns
:查看列名df.values
:查看矩陣的值df.describe()
:查看矩陣的統計描述,包括值的個數,平均值,標準差,最大最小值等等df.T
:轉置矩陣df.sort_index(axis=1, ascending=False)
:經過列的大小值比較進行排序,axis=0時按照行的大小值進行排序df.sort_values(by='B')
df.A
或者df['A']
:選取某一列的值df[0:3]
:經過行號選取某幾行的值df['20101010':'20101030']
:經過索引選取某些行的值df.loc[data[0]]
:經過索引進行選取,表示的是locdf.iloc[1:3,1:4]
:經過位置進行選取df.iloc[[1,3,4],[0,2]]
:經過位置跳躍式選取,表示的是int loc,經過正數進行索引df[df.A > 0]
:條件選擇首先複製並修改一下df的索引和columns
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
這樣由於第E列是沒有賦值的因此所有爲NAN
對於nan數據的處理有兩種方法,分別是dropna
和fillna
df1.dropnan(how='any')
:刪除全部值爲nan的行df1.fillnan(value=5)
:將全部nan的值填充爲5,能夠用字典的形式指定每一列的填充值查找全部的nan,pd.isnull(df1)
或者是pd.notnull(df)
df.mean()
:默認求取的是每列的值,獲得一個行向量df.mean(1)
:按行求平均值,獲得一個列向量df.apply(lambda:x:x.max()-x.min())
:apply應用一個函數到增長行: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.where
和DataFrame.str.contains('')
來進行斷定一個字符串是否包含windows,若是包含則將其改成windows,不然將其改成'not windows'
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
好比在電影打分裏面,想獲得男女對不一樣電影的打分,能夠使用如下的函數
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很像,將多級索引編程列值
讀入方法
read_csv
:用於讀取csv,默認分隔符爲逗號,須要修改默認分隔符用seperator參數,指定列名用header,無列名時用header=None,無index用index=Noneread_table
:讀取txt文件,默認分隔符'\t',若是分隔符不止一個\t的空格,那麼用seperator='\s+'read_fwf
:fixed-width file,讀取定寬文件,也就是沒有分隔符read_clipboard
:讀取剪貼板中的數據,在將網頁轉換爲表格時頗有用讀入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.str.xxx
其中包含了一大堆字符串處理函數,好比:contains,findall
也能夠使用map和正則表達式來完成