1. 程式人生 > >十分鐘(小時)學習pandas

十分鐘(小時)學習pandas

describe 顯式 加載數據 pes 參數 文章 十分鐘 down ror

十分鐘(小時)學習pandas

一、導語

這篇文章從pandas官網翻譯:鏈接,而且也有很多網友翻譯過,而我為什麽沒去看他們的,而是去官網自己艱難翻譯呢?
畢竟這是一個學習的過程,別人寫的不如自己寫的記憶深刻。那麽開始吧。

1、pandas是什麽?

pandas是基於numpy的數據分析庫(如果你沒了解過numpy,可以在我的博客看numpy相關的文章),提供快速、靈活和富有表現力的數據結構。
pandas的數據結構分為Series(一維)和DataFrame(二維)。這兩個主要的數據結構在金融,統計,社會科學和許多工程領域大展神威。

2、pandas能做什麽?

  • 輕松處理丟失的數據(以NaN表示)
  • 大小可變性:可以從DataFrame和更高維的對象插入和刪除列
  • 自動顯式的數據對齊
  • 靈活的按組功能來執行對數據集拆分、聯合操作
  • 可輕松地將Python和Numpy數據結構中的不同索引的數據轉換為DataFrame對象
  • 可以智能地對大型數據集基於標簽進行切片
  • 直觀的合並和連接數據集
  • 數據集靈活的重塑和旋轉
  • 坐標軸分層標記
  • 強大是IO工具:可以從CSV、Excel文件、數據庫加載數據,以及從超快的HDF5格式保存和加載數據
  • 時間序列-特定功能:日期範圍生成和頻率轉換

3、導入numpy、pandas庫

    import pandas as pd
    import numpy as np

二、對象的創建

1、創建一個Series:index

    s = pd.Series([1,2,3,4],index=list(‘abcd‘))
    out:
    a    1
    b    2
    c    3
    d    4
    dtype: int64

2、創建一個DataFrame

通過numpy數組,並制定日期時間索引和標簽列來創建

    dates = pd.date_range(‘20170123‘,periods=6)
    print(dates)
    df = pd.DataFrame(np.random.randn(6,4),index=
dates,columns=list(‘abcd‘)) print(df) out: DatetimeIndex([‘2017-01-23‘, ‘2017-01-24‘, ‘2017-01-25‘, ‘2017-01-26‘, ‘2017-01-27‘, ‘2017-01-28‘], dtype=‘datetime64[ns]‘, freq=‘D‘) a b c d 2017-01-23 -1.081953 2.547690 0.428435 -2.513003 2017-01-24 -1.123833 -2.080332 0.540281 1.100093 2017-01-25 0.048541 -0.295839 -0.236631 0.107606 2017-01-26 -0.890604 0.408112 0.765936 -0.829474 2017-01-27 -0.845467 2.140932 0.046358 -0.557103 2017-01-28 0.448769 0.584306 -1.892730 -2.223615

通過傳遞一個可以轉換為一系列的對象的字典

    df2 = pd.DataFrame({
        ‘A‘:1,
        ‘B‘:pd.Timestamp(‘20100123‘),
        ‘C‘:pd.Series(1,index=list(range(4)),dtype=‘float32‘),
        ‘D‘:np.array([3] * 4,dtype=‘int32‘),
        ‘E‘:pd.Categorical([‘test‘,‘train‘,‘test‘,‘train‘]),
        ‘F‘:‘foobar‘
    })
    print(df2)
    print(‘df2 dtypes:‘)
    print(df2.dtypes)

    out:
       A          B    C  D      E       F
    0  1 2010-01-23  1.0  3   test  foobar
    1  1 2010-01-23  1.0  3  train  foobar
    2  1 2010-01-23  1.0  3   test  foobar
    3  1 2010-01-23  1.0  3  train  foobar

    df2.dtypes:
    A             int64
    B    datetime64[ns]
    C           float32
    D             int32
    E          category
    F            object
    dtype: object

三、查看數據

1、查看數據的頂部和底部的行

    df.head(2) #默認為5行
        year    month   day     hour    season
    0   2010.0  5.0     29.0        17.0    1.0
    1   2014.0  2.0     15.0        15.0    4.0

    df.tail()
            year    month   day     hour    season
    37788   2014.0  1.0     4.0     0.0     4.0
    37789   2014.0  4.0     3.0     8.0     1.0

2、顯示索引、列和底層的Numpy數據

  • df.index 顯示索引
  • df.columns 顯示列名
  • df.values 返回的是一個numpy.ndarray類型

3、顯示數據的快速統計摘要

 df.describe()
            a           b           c           d
    count   6.000000    6.000000    6.000000    6.000000
    mean    -0.574091   0.550811    -0.058059   -0.819249
    std     0.658465    1.683878    0.967726    1.374977
    min     -1.123833   -2.080332   -1.892730   -2.513003
    25%     -1.034116   -0.119852   -0.165884   -1.875080
    50%     -0.868035   0.496209    0.237396    -0.693288
    75%     -0.174961   1.751775    0.512319    -0.058571
    max     0.448769    2.547690    0.765936    1.100093

4、翻轉數據

  • df.T

5、按軸排序

    df2.sort_index(axis=0,ascending=False)
    A   B           C       D       E   F
3   1   2010-01-23  1.0     3   train   foobar
2   1   2010-01-23  1.0     3   test    foobar
1   1   2010-01-23  1.0     3   train   foobar
0   1   2010-01-23  1.0     3   test    foobar

6、按值排序

    df2.sort_values(by=‘E‘)
    A   B           C   D   E       F
0   1   2010-01-23  1.0 3   test    foobar
2   1   2010-01-23  1.0 3   test    foobar
1   1   2010-01-23  1.0 3   train   foobar
3   1   2010-01-23  1.0 3   train   foobar

四、選擇數據

1、通過[‘column_name‘]選擇一個列,得到Series

df[‘A‘] #等效於df.A

2、通過[]切片選擇行

    df[‘day‘][:6]  
0    29.0
1    15.0
2     6.0
3     5.0
4    25.0
5    26.0
Name: day, dtype: float64

3、基於標簽選擇

.loc屬性是主訪問方法。以下是有效的輸入:

  • 單個標簽,例如5或‘a‘(在這裏5被解釋為索引的標簽)
  • 標簽的列表或者數組[‘a,‘b‘,‘c‘]
  • 具有標簽 ‘b‘:‘e‘的切片對象(註意,這裏與通常的python切片相反,包括開始和停止,他是包括開始和結束的)
  • 可以是一個布爾數組
  • 一個callable

    s1 = pd.Series(np.random.randn(6),index=list(‘abcdef‘))

    out:
    a 1.715955
    b 0.307930
    c -0.971638
    d -0.594908
    e -3.134987
    f 0.396613
    dtype: float64
    ***

    s1.loc[‘b‘:‘e‘]
    out:
    b    0.307930
    c   -0.971638
    d   -0.594908
    e   -3.134987
    dtype: float64

    s1.loc[‘b‘]
    out:
    0.30792993178289157

    還可以用來設置value

    s1.loc[‘b‘] = 0

    out:
    a 1.715955
    b 0.000000
    c -0.971638
    d -0.594908
    e -3.134987
    f 0.396613
    dtype: float64

使用在DataFrame

df1 = pd.DataFrame(np.random.randn(6,4),
                  index = list(‘abcdef‘),
                  columns=list(‘ABCD‘))
out:
    A           B           C           D
a   1.235823    -0.767938   -0.750474   0.342353
b   0.506219    0.388180    0.400716    0.207014
c   -0.813548   0.509618    0.311099    -0.645569
d   -0.510755   -0.195760   1.162505    -2.125746
e   -0.559745   -0.937668   0.363403    0.554602
f   -1.512407   0.865061    -0.602054   0.207695

df1.loc[[‘a‘,‘b‘,‘e‘],:]
out:
    A           B           C           D
a   1.235823    -0.767938   -0.750474   0.342353
b   0.506219    0.388180    0.400716    0.207014
e   -0.559745   -0.937668   0.363403    0.554602

使用標簽獲取行(等效於df.xs(‘a‘))

df1.loc[‘a‘]

out:
A    1.235823
B   -0.767938
C   -0.750474
D    0.342353
Name: a, dtype: float64

獲取帶有布爾數組的值

df1.loc[‘a‘] > 0

out:
A     True
B    False
C    False
D     True
Name: a, dtype: bool

顯示獲取值.loc[‘行標簽‘,‘列標簽‘]

df1.loc[‘a‘,‘A‘]

out:
1.2358232787452161

基於索引的選擇

.iloc屬性可以獲得純粹基於整數的索引。語義準訊python和numpy切片,包括起始便捷,不包括結束邊界。
如果使用的索引是非整數,即使是有效的便簽也會參數IndexError。

以下是.iloc屬性的有效輸入

  • 整數,例如7
  • 整數列表或者數組,例如[4,2,0]
  • 整數的切片(slice)對象,例如1::7
  • 一個布爾數組
  • 一個callable
s2 = pd.Series(np.random.randn(5),index=list(range(0,10,2)))
out:
0   -1.051477
2   -0.495461
4    2.417686
6    0.329432
8    1.479104
dtype: float64

s2.iloc[:3]
out:
0   -1.051477
2   -0.495461
4    2.417686
6    0.000000
8    1.479104
dtype: float64

s2.iloc[3] = 0 #還可以使用iloc來修改一個的value
out:
0   -1.051477
2   -0.495461
4    2.417686
6    0.000000
8    1.479104
dtype: float64

s2.iloc[:3] = 0 #還是使用iloc連續賦值
out:
0    0.000000
2    0.000000
4    0.000000
6    0.000000
8    1.479104
dtype: float64

使用在DataFrame

df2 = pd.DataFrame(np.random.randn(6,4),
                  index=list(range(0,12,2)),
                  columns=list(range(0,8,2)))
out:
0   2           4           6
0   -0.708809   -0.417166   -1.296387   0.620899
2   -1.514339   1.145004    0.877585    -1.695285
4   1.365427    -0.721800   -0.719877   -0.418820
6   0.980937    0.230571    -0.783681   -0.985872
8   1.031649    -1.232232   0.795309    1.294055
10  0.618609    -1.370898   0.229622    0.817530

通過整數切片進行選擇

df2.iloc[:3]
out:
    0           2           4           6
0   -0.708809   -0.417166   -1.296387   0.620899
2   -1.514339   1.145004    0.877585    -1.695285
4   1.365427    -0.721800   -0.719877   -0.418820

通過整數列表進行選擇

df2.iloc[[1,3,5],[1,3]]
out:
    2           6
2   1.145004    -1.695285
6   0.230571    -0.985872
10  -1.370898   0.817530

df2.iloc[1:3,:] #df2.iloc[:,1:3]
out:
    0           2           4           6
2   -1.514339   1.145004    0.877585    -1.695285
4   1.365427    -0.721800   -0.719877   -0.418820

還可以獲得值 .loc[‘行位置‘,‘列位置‘]

df2.iloc[0,1]
out:
-0.41716586227691288

獲取整數位置的行(等於df.xs(1))

df2.iloc[1]
out:
0   -1.514339
2    1.145004
4    0.877585
6   -1.695285
Name: 2, dtype: float64

超出範圍的切片索引,會像python、numpy一樣優雅的處理(pandas v0.14.0之前並不能這樣,否則可能會導致返回一個空的DataFrame)

df2.iloc[:3,:1000]
out:
    0           2           4           6
0   -0.708809   -0.417166   -1.296387   0.620899
2   -1.514339   1.145004    0.877585    -1.695285
4   1.365427    -0.721800   -0.719877   -0.418820

超出範圍的單個索引器將生成IndexError(並不能像切片那樣優雅地處理)。任何元素超出邊界的索引器列表將生成IndexError

df2.iloc[[1,2,8]]
IndexError: positional indexers are out-of-bounds

未完待續...

十分鐘(小時)學習pandas