9-Python 科學(xué)計(jì)算_pandas 篇

課程概要:
  1、pandas 庫(kù)之?dāng)?shù)據(jù)篩選及過(guò)濾
  2、pandas 庫(kù)之字符串提取與操作
  3、pandas庫(kù)之散點(diǎn)圖
  4、pandas 庫(kù)之直方圖

1、pandas 庫(kù)之?dāng)?shù)據(jù)篩選及過(guò)濾

>>> import numpy as np
>>> import pandas as pd
>>> dates = pd.date_range('20160101',periods=6)     #  從當(dāng)前日期往后生成6個(gè)日期元素
>>> dates
<class 'pandas.tseries.index.DatetimeIndex'>
[2016-01-01, ..., 2016-01-06]
Length: 6, Freq: D, Timezone: None
>>> df = pd.DataFrame(np.random.rand(6,4),index=dates,columns=list('ABCD'))
        #   DataFrame 不可以小寫(xiě)
        #   np.random.rand(6,4),隨機(jī)生成一個(gè)6*4的矩陣,其元素介于0-1之間
        #   index=dates 索引按照dates的日期元素作為索引
        #   columns=list('ABCD'),列名為A,B,C,D
>>> df
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[6 rows x 4 columns]
>>> df2 = pd.DataFrame({'A':np.random.rand(6)})
>>> df2
          A
0  0.942403
1  0.849205
2  0.745943
3  0.741686
4  0.916450
5  0.480425

[6 rows x 1 columns]
>>> df3 = pd.DataFrame({'A':np.random.rand(6)},index=dates)
>>> df3
                   A
2016-01-01  0.954572
2016-01-02  0.673110
2016-01-03  0.991391
2016-01-04  0.662053
2016-01-05  0.191929
2016-01-06  0.896591

[6 rows x 1 columns]
>>> df['A']         
2016-01-01    0.144196
2016-01-02    0.256549
2016-01-03    0.090722
2016-01-04    0.569605
2016-01-05    0.125042
2016-01-06    0.028161
Freq: D, Name: A, dtype: float64
>>> df[1:3]                 
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326

[2 rows x 4 columns]
>>> df['20160102':'20160104']       #   行切片,注意這個(gè)切片是取到右邊
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195

[3 rows x 4 columns]
df.loc['20160101':'20160104',['A','B']]
                   A         B
2016-01-01  0.144196  0.647273
2016-01-02  0.256549  0.141528
2016-01-03  0.090722  0.565770
2016-01-04  0.569605  0.011851

[4 rows x 2 columns]
>>> df.at[dates[0],'A']
0.14419598649708365
>>> df.dtypes
A    float64
B    float64
C    float64
D    float64
dtype: object
>>> df.head()           #   查看前5行,默認(rèn)的就是 n=5
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522

[5 rows x 4 columns]
>>> df.head(3)      #   查看前3行
                   A         B         C         D
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326

[3 rows x 4 columns]
>>> df.tail()           #   查看后5行
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[5 rows x 4 columns]
>>> df.tail(3)
                   A         B         C         D
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522
2016-01-06  0.028161  0.169375  0.637185  0.271154

[3 rows x 4 columns]
>>> df.index
<class 'pandas.tseries.index.DatetimeIndex'>
[2016-01-01, ..., 2016-01-06]
Length: 6, Freq: D, Timezone: None
>>> df.columns
Index([u'A', u'B', u'C', u'D'], dtype='object')
>>> df.values
array([[ 0.14419599,  0.6472727 ,  0.08579066,  0.75429817],
       [ 0.25654929,  0.1415283 ,  0.04540702,  0.92560391],
       [ 0.09072181,  0.56576979,  0.07799159,  0.37032625],
       [ 0.56960508,  0.01185102,  0.84449454,  0.05919541],
       [ 0.1250417 ,  0.43677787,  0.91123057,  0.13352195],
       [ 0.02816118,  0.16937545,  0.63718452,  0.27115381]])
>>> df.describe()
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.202379  0.328763  0.433683  0.419017
std    0.194923  0.256976  0.409032  0.347637
min    0.028161  0.011851  0.045407  0.059195
25%    0.099302  0.148490  0.079941  0.167930
50%    0.134619  0.303077  0.361488  0.320740
75%    0.228461  0.533522  0.792667  0.658305
max    0.569605  0.647273  0.911231  0.925604

[8 rows x 4 columns]
>>> df.T
   2016-01-01  2016-01-02  2016-01-03  2016-01-04  2016-01-05  2016-01-06
A    0.144196    0.256549    0.090722    0.569605    0.125042    0.028161
B    0.647273    0.141528    0.565770    0.011851    0.436778    0.169375
C    0.085791    0.045407    0.077992    0.844495    0.911231    0.637185
D    0.754298    0.925604    0.370326    0.059195    0.133522    0.271154

[4 rows x 6 columns]
>>> df.sort(columns='C')        #   按照C列進(jìn)行排序
                   A         B         C         D
2016-01-02  0.256549  0.141528  0.045407  0.925604
2016-01-03  0.090722  0.565770  0.077992  0.370326
2016-01-01  0.144196  0.647273  0.085791  0.754298
2016-01-06  0.028161  0.169375  0.637185  0.271154
2016-01-04  0.569605  0.011851  0.844495  0.059195
2016-01-05  0.125042  0.436778  0.911231  0.133522

[6 rows x 4 columns]
>>> df = pd.DataFrame(np.random.randn(6,4),columns=list('abcd'))
>>> df
          a         b         c         d
0  1.198543 -1.868721  1.745448 -1.036422
1 -0.529202 -0.012269  0.969534  0.023551
2  1.630468 -1.562662  0.396634  0.483880
3  0.113079 -0.791460  1.127796  1.232607
4  0.012088  0.848480 -1.202130 -0.066336
5 -0.937329 -0.798681 -1.716528 -0.528337

[6 rows x 4 columns]
>>> df[df.d > 0]        #   選出d列
          a         b         c         d
1 -0.529202 -0.012269  0.969534  0.023551
2  1.630468 -1.562662  0.396634  0.483880
3  0.113079 -0.791460  1.127796  1.232607

[3 rows x 4 columns]
>>> df[df.d > 0] & df[df.c < 0]
    a   b   c   d
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 NaN NaN NaN NaN
5 NaN NaN NaN NaN

[5 rows x 4 columns]
>>> df[df.c < 0][['a','b']]
          a         b
4  0.012088  0.848480
5 -0.937329 -0.798681

[2 rows x 2 columns]

2、pandas 庫(kù)之字符串提取與操作

>>> import pandas as pd
>>> s = pd.Series(list('ABCDEF'))       #   產(chǎn)生的是一個(gè)字符串的序列(n*1)
>>> s
0    A
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s.str.lower()       #   將字符串的字母小寫(xiě)
0    a
1    b
2    c
3    d
4    e
5    f
dtype: object
>>> s.str.upper()       #   將字符串的字母大寫(xiě)
0    A
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s.str.replace('A','B')          #   替換,將s序列中所有的字母A替換成B
0    B
1    B
2    C
3    D
4    E
5    F
dtype: object
>>> s = pd.Series(['a1','a2','a3','a4'])
>>> s
0    a1
1    a2
2    a3
3    a4
dtype: object
#   提取字符串
>>> s.str.extract('[ab](\d)')       #   正則表達(dá)式
0    1                      #   [ab] 表示匹配內(nèi)容是a,b字符中其中一個(gè)
1    2                      #   (\d)::\d表示匹配的是整型
2    3                      #         :( ) 表示返回的內(nèi)容
3    4
dtype: object
>>> s.str.extract('([abc])(\d)')        #   返回的是兩列
   0  1
0  a  1
1  a  2
2  a  3
3  a  4

[4 rows x 2 columns]
>>> s.str.extract('([abc]\d)')
0    a1
1    a2
2    a3
3    a4
dtype: object
>>> s.str.extract('(?P<str>[abc])(?P<digit>(\d))')      #   ?:匹配前面的子表達(dá)式零次或一次
  str digit  2      #   ?P:非獲取匹配,匹配pattern但不獲取匹配結(jié)果,不進(jìn)行存儲(chǔ)供以后使用
0   a     1  1
1   a     2  2
2   a     3  3
3   a     4  4

[4 rows x 3 columns]
>>> s = pd.Series(['a','B','c','d'])
>>> pattern = r'[a-z]'
>>> s.str.contains(pattern)
0     True
1    False
2     True
3     True
dtype: bool
>>> pattern = r'A-Za-z]'
>>> s.str.contains(pattern)
0    False
1    False
2    False
3    False
dtype: bool
>>> s = pd.Series(['ab','Ba','c','d'])
>>> s.str.contains('^a')            #   ^a 表示匹配以a開(kāi)頭的字母
0     True  
1    False
2    False
3    False
dtype: bool
>>> s.str.startswith('a')
0     True
1    False
2    False
3    False
dtype: bool
>>> s.str.endswith('a')
0    False
1     True
2    False
3    False
dtype: bool
>>> s.str.contains('a$')        #   a$ 表示匹配以a 結(jié)尾
0    False
1     True
2    False
3    False
dtype: bool

三、pandas 庫(kù)之散點(diǎn)圖

#   如何讀取Excel中的數(shù)據(jù)
>>> df = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1',index_col=0)
        #   三個(gè)參數(shù):①路徑;②標(biāo)簽;③index_col = 0 讓excel中默認(rèn)索引值不顯示
>>> df
    child  parent
id               
1      10      30
2      11      31
3      12      32
4      13      33
5      14      34
6      15      35
7      16      36
8      17      37
9      18      38
10     19      39
11     20      40

[11 rows x 2 columns]
>>> df1 = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1')
>>> df1
    id  child  parent
0    1     10      30
1    2     11      31
2    3     12      32
3    4     13      33
4    5     14      34
5    6     15      35
6    7     16      36
7    8     17      37
8    9     18      38
9   10     19      39
10  11     20      40

[11 rows x 3 columns]
>>> pl = df.plot(kind='scatter',x='child',y='parent').get_figure()
>>> pl.savefig(r'D:\1.jpg')
import pandas as pd
import numpy as np

def func(ser,factor):
    ''' ser:傳入的序列,factor:傳入的抖動(dòng)值
    '''
    z = float(ser.max())-float(ser.min())
    a = float(factor)*z/50
    return ser.apply(lambda x:x+np.random.uniform(-a,a))
        #   np.random.uniform(-a,a) :-a和a之間隨機(jī)浮點(diǎn)數(shù)
    
df = pd.read_excel(r'D:\Doc_Py\test.xls','Sheet1',index_col=0)
df['child']=func(df['child'],1)
df['parent'] = func(df['parent'],1)

plt = df.plot(kind='scatter',x='child',y='parent').get_figure()
plt.savefig(r'D:\2.jpg')
from statsmodels.formula.api import ols     
#   statsmodels.formula.api是統(tǒng)計(jì)建模的工具包,ols 是建立一個(gè)線性回歸方程
#   使用statsmodels時(shí)要求有patsy這個(gè)庫(kù)
import matplotlib.pyplot as  plt    
import numpy as np
import pandas as pd

path = r'D:\Doc_Py\test.xls'
df = pd.read_excel(path,'Sheet1',index_col=0)
l = ols('child~parent',df).fit()        #   ols 以parent 為自變量建立線性回歸方程

plt.plot(df['parent'],df['child'],'ob') #   傳入parent和child的值,先繪制散點(diǎn)圖
    #   ‘ob’ 表示散點(diǎn)使用藍(lán)色原點(diǎn)標(biāo)記
plt.plot(df['parent'],l.fittedvalues,'r',linewidth=2)   #   l.fittedvalues:回歸方程的預(yù)測(cè)的值
                        #   ‘r’ 表示紅色線,再繪制出線性回歸方程的擬合線
plt.show()

四、pandas 庫(kù)之直方圖

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
plt = df.plot(kind='bar').get_figure()      #   kind=’bar’,表示為柱形圖
plt.savefig(r'D:\4.jpg')
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')        #   設(shè)置mpl格式
plt = df.plot(kind='bar').get_figure()
plt.savefig(r'D:\4-2.jpg')
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')
plt = df.plot(kind='bar',stacked=True).get_figure()     #   stacked=True:設(shè)置堆積模式
plt.savefig(r'D:\4.jpg')        #   可以覆蓋掉前面的圖片文件
df = pd.DataFrame(np.random.rand(10,4),columns=list('ABCD'))
pd.set_option('mpl_style','default')
plt = df.plot(kind='barh',stacked=True).get_figure()        #   設(shè)置水平樣式
plt.savefig(r'D:\4.jpg')
df = pd.DataFrame(np.random.rand(100,4),columns=list('abcd'))
d = df['a'].hist().get_figure()
d.savefig(r'D:\4.jpg')
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

pd.set_option('mpl_style','default')
fig,ax = plt.subplots()
df = pd.DataFrame(np.random.rand(100,2),columns=list('ab'))
df.boxplot(ax=ax)
d.savefig(r'D:\4.jpg')          #   這里是不能使用show( )的
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pandas.util.testing as tm

pd.set_option('mpl_style','default')
fig,ax = plt.subplots()
df = pd.DataFrame(np.random.rand(100,2),columns=list('ab'))
df['x'] =tm.choice(['M','F'],size=100)
df.boxplot(ax=ax,by='x')
plt.savefig(r'D:\5.jpg')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考:https://amaozhao.gitbooks.io/pandas-notebook/content/h...
    與爾巖說(shuō)閱讀 8,881評(píng)論 0 26
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評(píng)論 25 709
  • 時(shí)間:2015.3.14 地點(diǎn):北大醫(yī)學(xué)部逸夫樓108 主講人:強(qiáng)生校園招聘經(jīng)理 Yolanda 此次講座作為內(nèi)部...
    碧碧閱讀 2,412評(píng)論 0 4
  • 語(yǔ)文: 今天學(xué)習(xí)的“?!薄澳獭狈謩e一字一音加筆順和兩個(gè)詞。 數(shù)學(xué): 數(shù)學(xué)新課基本結(jié)束了,今天的作業(yè)是訂正數(shù)學(xué)書(shū)89...
    瑞睿家閱讀 206評(píng)論 0 0
  • 冬季到來(lái),比以往都要冷上許多,我路過(guò)熟悉的那條街道,一陣憂傷積在心頭……我已經(jīng)不記得在那三年里多少次同她沿著這...
    終成夢(mèng)閱讀 253評(píng)論 0 2

友情鏈接更多精彩內(nèi)容