Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲精品日本高清中文字幕,国产精品毛片在线完整版的,日韩手机在线视频

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          25個Pandas數據分析技巧,初學者掌握這些就夠了

          25個Pandas數據分析技巧,初學者掌握這些就夠了

          天給大家準備了25個pandas高頻實用技巧,讓你數據處理速度直接起飛。文章較長,建議收藏!

          首先我們需要先提前下載好示例數據集

          • drinksbycountry.csv : http://bit.ly/drinksbycountry
          • imdbratings.csv : http://bit.ly/imdbratings
          • chiporders.csv : http://bit.ly/chiporders
          • smallstockers.csv : http://bit.ly/smallstocks
          • kaggletrain.csv : http://bit.ly/kaggletrain
          • uforeports.csv : http://bit.ly/uforeports

          導入案例數據集

          import pandas as pd
          import numpy as np
          
          drinks=pd.read_csv('http://bit.ly/drinksbycountry')
          movies=pd.read_csv('http://bit.ly/imdbratings')
          orders=pd.read_csv('http://bit.ly/chiporders', sep='\t')
          orders['item_price']=orders.item_price.str.replace('$', '').astype('float')
          stocks=pd.read_csv('http://bit.ly/smallstocks', parse_dates=['Date'])
          titanic=pd.read_csv('http://bit.ly/kaggletrain')
          ufo=pd.read_csv('http://bit.ly/uforeports', parse_dates=['Time'])

          1顯示已安裝的版本

          有時你需要知道正在使用的pandas版本,特別是在閱讀pandas文檔時。你可以通過輸入以下命令來顯示pandas版本:

          pd.__version__
          '0.25.8'

          如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數:

          pd.show_versions()
          INSTALLED VERSIONS
          ------------------
          commit: None
          python: 3.7.3.final.0
          python-bits: 64
          OS: Darwin
          OS-release: 18.6.0
          machine: x86_64
          processor: i386
          byteorder: little
          LC_ALL: None
          LANG: en_US.UTF-8
          LOCALE: en_US.UTF-8
          
          pandas: 0.24.2
          pytest: None
          pip: 19.1.1
          setuptools: 41.0.1
          Cython: None
          numpy: 1.16.4
          scipy: None
          pyarrow: None
          xarray: None
          IPython: 7.5.0
          sphinx: None
          patsy: None
          dateutil: 2.8.0
          pytz: 2019.1
          blosc: None
          bottleneck: None
          tables: None
          numexpr: None
          feather: None
          matplotlib: 3.1.0
          openpyxl: None
          xlrd: None
          xlwt: None
          xlsxwriter: None
          lxml.etree: None
          bs4: None
          html5lib: None
          sqlalchemy: None
          pymysql: None
          psycopg2: None
          jinja2: 2.10.1
          s3fs: None
          fastparquet: None
          pandas_gbq: None
          pandas_datareader: None
          gcsfs: None

          你可以查看到Python,pandas, Numpy, matplotlib等的版本信息。

          2創建示例DataFrame

          假設你需要創建一個示例DataFrame。有很多種實現的途徑,我最喜歡的方式是傳一個字典給DataFrame constructor,其中字典中的keys為列名,values為列的取值。

          df=pd.DataFrame({'col one':[100, 200], 'col two':[300, 400]})
          df

          如果你需要更大的DataFrame,上述方法將需要太多的輸入。在這種情況下,你可以使用NumPy的 random.rand()函數,定義好該函數的行數和列數,并將其傳遞給DataFrame構造器:

          pd.DataFrame(np.random.rand(4, 8))

          這種方式很好,但如果你還想把列名變為非數值型的,你可以強制地將一串字符賦值給columns參數:

          pd.DataFrame(np.random.rand(4, 8), columns=list('abcdefgh'))

          你可以想到,你傳遞的字符串的長度必須與列數相同。

          3更改列名

          我們來看一下剛才我們創建的示例DataFrame:

          df

          我更喜歡在選取pandas列的時候使用點(.),但是這對那么列名中含有空格的列不會生效。讓我們來修復這個問題。

          更改列名最靈活的方式是使用rename()函數。你可以傳遞一個字典,其中keys為原列名,values為新列名,還可以指定axis:

          df=df.rename({'col one':'col_one',
                          'col two':'col_two'},
                          axis='columns')

          使用這個函數最好的方式是你需要更改任意數量的列名,不管是一列或者全部的列。

          如果你需要一次性重新命令所有的列名,更簡單的方式就是重寫DataFrame的columns屬性:

          df.columns=['col_one', 'col_two']

          如果你需要做的僅僅是將空格換成下劃線,那么更好的辦法是用str.replace()方法,這是因為你都不需要輸入所有的列名:

          df.columns=df.columns.str.replace(' ', '_')

          上述三個函數的結果都一樣,可以更改列名使得列名中不含有空格:

          df

          最后,如果你需要在列名中添加前綴或者后綴,你可以使用add_prefix()函數:

          df.add_prefix('X_')

          或者使用add_suffix()函數:

          df.add_suffix('_Y')

          4. 行序反轉

          我們來看一下drinks這個DataFame:

          drinks.head()

          該數據集描述了每個國家的平均酒消費量。如果你想要將行序反轉呢?

          最直接的辦法是使用loc函數并傳遞::-1,跟Python中列表反轉時使用的切片符號一致:

          drinks.loc[::-1].head()

          如果你還想重置索引使得它從0開始呢?

          你可以使用reset_index()函數,告訴他去掉完全拋棄之前的索引:

          drinks.loc[::-1].reset_index(drop=True).head()

          你可以看到,行序已經反轉,索引也被重置為默認的整數序號。

          5. 列序反轉

          跟之前的技巧一樣,你也可以使用loc函數將列從左至右反轉

          drinks.loc[:, ::-1].head()

          逗號之前的冒號表示選擇所有行,逗號之后的::-1表示反轉所有的列,這就是為什么country這一列現在在最右邊。

          6. 通過數據類型選擇列

          這里有drinks這個DataFrame的數據類型:

          drinks.dtypes
          country                          object
          beer_servings                     int64
          spirit_servings                   int64
          wine_servings                     int64
          total_litres_of_pure_alcohol    float64
          continent                        object
          dtype: object

          假設你僅僅需要選取數值型的列,那么你可以使用select_dtypes()函數:

          drinks.select_dtypes(include='number').head()

          這包含了int和float型的列。

          你也可以使用這個函數來選取數據類型為object的列:

          drinks.select_dtypes(include='object').head()

          你還可以選取多種數據類型,只需要傳遞一個列表即可:

          drinks.select_dtypes(include=['number', 'object', 'category', 'datetime']).head()

          你還可以用來排除特定的數據類型:

          drinks.select_dtypes(exclude='number').head()

          7. 將字符型轉換為數值型

          我們來創建另一個示例DataFrame:

          df=pd.DataFrame({'col_one':['1.1', '2.2', '3.3'],
                             'col_two':['4.4', '5.5', '6.6'],
                             'col_three':['7.7', '8.8', '-']})
          df

          這些數字實際上儲存為字符型,導致其數據類型為object:

          df.dtypes
          col_one      object
          col_two      object
          col_three    object
          dtype: object

          為了對這些列進行數學運算,我們需要將數據類型轉換成數值型。你可以對前兩列使用astype()函數:

          df.astype({'col_one':'float', 'col_two':'float'}).dtypes
          col_one      float64
          col_two      float64
          col_three     object
          dtype: object

          但是,如果你對第三列也使用這個函數,將會引起錯誤,這是因為這一列包含了破折號(用來表示0)但是pandas并不知道如何處理它。

          你可以對第三列使用to_numeric()函數,告訴其將任何無效數據轉換為NaN:

          pd.to_numeric(df.col_three, errors='coerce')
          0    7.7
          1    8.8
          2    NaN
          Name: col_three, dtype: float64

          如果你知道NaN值代表0,那么你可以fillna()函數將他們替換成0:

          pd.to_numeric(df.col_three, errors='coerce').fillna(0)
          0    7.7
          1    8.8
          2    0.0
          Name: col_three, dtype: float64

          最后,你可以通過apply()函數一次性對整個DataFrame使用這個函數:

          df=df.apply(pd.to_numeric, errors='coerce').fillna(0)
          df

          僅需一行代碼就完成了我們的目標,因為現在所有的數據類型都轉換成float:

          df.dtypes
          col_one      float64
          col_two      float64
          col_three    float64
          dtype: object

          8. 減小DataFrame空間大小

          pandas DataFrame被設計成可以適應內存,所以有些時候你可以減小DataFrame的空間大小,讓它在你的系統上更好地運行起來。

          這是drinks這個DataFrame所占用的空間大小:

          drinks.info(memory_usage='deep')
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 193 entries, 0 to 192
          Data columns (total 6 columns):
          country                         193 non-null object
          beer_servings                   193 non-null int64
          spirit_servings                 193 non-null int64
          wine_servings                   193 non-null int64
          total_litres_of_pure_alcohol    193 non-null float64
          continent                       193 non-null object
          dtypes: float64(1), int64(3), object(2)
          memory usage: 30.4 KB

          可以看到它使用了304.KB。

          如果你對你的DataFrame有操作方面的問題,或者你不能將它讀進內存,那么在讀取文件的過程中有兩個步驟可以使用來減小DataFrame的空間大小。

          第一個步驟是只讀取那些你實際上需要用到的列,可以調用usecols參數:

          cols=['beer_servings', 'continent']
          small_drinks=pd.read_csv('http://bit.ly/drinksbycountry', usecols=cols)
          small_drinks.info(memory_usage='deep')
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 193 entries, 0 to 192
          Data columns (total 2 columns):
          beer_servings    193 non-null int64
          continent        193 non-null object
          dtypes: int64(1), object(1)
          memory usage: 13.6 KB

          通過僅讀取用到的兩列,我們將DataFrame的空間大小縮小至13.6KB。

          第二步是將所有實際上為類別變量的object列轉換成類別變量,可以調用dtypes參數:

          dtypes={'continent':'category'}
          smaller_drinks=pd.read_csv('http://bit.ly/drinksbycountry', usecols=cols, dtype=dtypes)
          smaller_drinks.info(memory_usage='deep')
          <class 'pandas.core.frame.DataFrame'>
          RangeIndex: 193 entries, 0 to 192
          Data columns (total 2 columns):
          beer_servings    193 non-null int64
          continent        193 non-null category
          dtypes: category(1), int64(1)
          memory usage: 2.3 KB

          通過將continent列讀取為category數據類型,我們進一步地把DataFrame的空間大小縮小至2.3KB。

          值得注意的是,如果跟行數相比,category數據類型的列數相對較小,那么catefory數據類型可以減小內存占用。

          9. 按行從多個文件中構建DataFrame

          假設你的數據集分化為多個文件,但是你需要將這些數據集讀到一個DataFrame中。

          舉例來說,我有一些關于股票的小數聚集,每個數據集為單天的CSV文件。

          pd.read_csv('data/stocks1.csv')
          pd.read_csv('data/stocks2.csv')
          pd.read_csv('data/stocks3.csv')

          你可以將每個CSV文件讀取成DataFrame,將它們結合起來,然后再刪除原來的DataFrame,但是這樣會多占用內存且需要許多代碼。

          更好的方式為使用內置的glob模塊。你可以給glob()函數傳遞某種模式,包括未知字符,這樣它會返回符合該某事的文件列表。在這種方式下,glob會查找所有以stocks開頭的CSV文件:

          from glob import glob
          
          stock_files=sorted(glob('data/stocks*.csv'))
          stock_files
          ['data/stocks1.csv', 'data/stocks2.csv', 'data/stocks3.csv']

          glob會返回任意排序的文件名,這就是我們為什么要用Python內置的sorted()函數來對列表進行排序。

          我們以生成器表達式用read_csv()函數來讀取每個文件,并將結果傳遞給concat()函數,這會將單個的DataFrame按行來組合:

          pd.concat((pd.read_csv(file) for file in stock_files))

          不幸的是,索引值存在重復。為了避免這種情況,我們需要告訴concat()函數來忽略索引,使用默認的整數索引:

          pd.concat((pd.read_csv(file) for file in stock_files), ignore_index=True)

          10. 按列從多個文件中構建DataFrame

          上一個技巧對于數據集中每個文件包含行記錄很有用。但是如果數據集中的每個文件包含的列信息呢?

          這里有一個例子,dinks數據集被劃分成兩個CSV文件,每個文件包含三列:

          pd.read_csv('data/drinks1.csv').head()

          pd.read_csv('data/drinks2.csv').head()

          同上一個技巧一樣,我們以使用glob()函數開始。這一次,我們需要告訴concat()函數按列來組合:

          drink_files=sorted(glob('data/drinks*.csv'))
          pd.concat((pd.read_csv(file) for file in drink_files), axis='columns').head()

          現在我們的DataFrame已經有六列了。

          11. 從剪貼板中創建DataFrame

          假設你將一些數據儲存在Excel或者Google Sheet中,你又想要盡快地將他們讀取至DataFrame中。

          你需要選擇這些數據并復制至剪貼板。然后,你可以使用read_clipboard()函數將他們讀取至DataFrame中:

          df=pd.read_clipboard()
          df

          read_csv()類似,read_clipboard()會自動檢測每一列的正確的數據類型:

          df.dtypes
          Column A      int64
          Column B    float64
          Column C     object
          dtype: object

          我們再復制另外一個數據至剪貼板:

          df=pd.read_clipboard()
          df

          神奇的是,pandas已經將第一列作為索引了:

          df.index
          Index(['Alice', 'Bob', 'Charlie'], dtype='object')

          需要注意的是,如果你想要你的工作在未來可復制,那么read_clipboard()并不值得推薦。

          12. 將DataFrame劃分為兩個隨機的子集

          假設你想要將一個DataFrame劃分為兩部分,隨機地將75%的行給一個DataFrame,剩下的25%的行給另一個DataFrame。

          舉例來說,我們的movie ratings這個DataFrame有979行:

          len(movies)
          979

          12. 將DataFrame劃分為兩個隨機的子集

          假設你想要將一個DataFrame劃分為兩部分,隨機地將75%的行給一個DataFrame,剩下的25%的行給另一個DataFrame。

          舉例來說,我們的movie ratings這個DataFrame有979行:

          movies_1=movies.sample(frac=0.75, random_state=1234)

          接著我們使用drop()函數來舍棄“moive_1”中出現過的行,將剩下的行賦值給"movies_2"DataFrame:

          movies_2=movies.drop(movies_1.index)

          你可以發現總的行數是正確的:

          len(movies_1) + len(movies_2)
          979

          你還可以檢查每部電影的索引,或者"moives_1":

          movies_1.index.sort_values()
          Int64Index([  0,   2,   5,   6,   7,   8,   9,  11,  13,  16,
                      ...
                      966, 967, 969, 971, 972, 974, 975, 976, 977, 978],
                     dtype='int64', length=734)

          或者"moives_2":

          movies_2.index.sort_values()
          Int64Index([  1,   3,   4,  10,  12,  14,  15,  18,  26,  30,
                      ...
                      931, 934, 937, 941, 950, 954, 960, 968, 970, 973],
                     dtype='int64', length=245)

          需要注意的是,這個方法在索引值不唯一的情況下不起作用。

          讀者注:該方法在機器學習或者深度學習中很有用,因為在模型訓練前,我們往往需要將全部數據集按某個比例劃分成訓練集和測試集。該方法既簡單又高效,值得學習和嘗試。

          13. 通過多種類型對DataFrame進行過濾

          我們先看一眼movies這個DataFrame:

          movies.head()

          其中有一列是genre(類型):

          movies.genre.unique()
          array(['Crime', 'Action', 'Drama', 'Western', 'Adventure', 'Biography',
                 'Comedy', 'Animation', 'Mystery', 'Horror', 'Film-Noir', 'Sci-Fi',
                 'History', 'Thriller', 'Family', 'Fantasy'], dtype=object)

          比如我們想要對該DataFrame進行過濾,我們只想顯示genre為Action或者Drama或者Western的電影,我們可以使用多個條件,以"or"符號分隔

          movies[(movies.genre=='Action') |
                 (movies.genre=='Drama') |
                 (movies.genre=='Western')].head()

          但是,你實際上可以使用isin()函數將代碼寫得更加清晰,將genres列表傳遞給該函數:

          movies[movies.genre.isin(['Action', 'Drama', 'Western'])].head()

          如果你想要進行相反的過濾,也就是你將吧剛才的三種類型的電影排除掉,那么你可以在過濾條件前加上破浪號:

          movies[~movies.genre.isin(['Action', 'Drama', 'Western'])].head()

          這種方法能夠起作用是因為在Python中,波浪號表示“not”操作。

          14. 從DataFrame中篩選出數量最多的類別

          假設你想要對movies這個DataFrame通過genre進行過濾,但是只需要前3個數量最多的genre。

          我們對genre使用value_counts()函數,并將它保存成counts(type為Series):

          counts=movies.genre.value_counts()
          counts
          Drama        278
          Comedy       156
          Action       136
          Crime        124
          Biography     77
          Adventure     75
          Animation     62
          Horror        29
          Mystery       16
          Western        9
          Sci-Fi         5
          Thriller       5
          Film-Noir      3
          Family         2
          Fantasy        1
          History        1
          Name: genre, dtype: int64

          該Series的nlargest()函數能夠輕松地計算出Series中前3個最大值:

          counts.nlargest(3)
          Drama     278
          Comedy    156
          Action    136
          Name: genre, dtype: int64

          事實上我們在該Series中需要的是索引:

          counts.nlargest(3).index
          Index(['Drama', 'Comedy', 'Action'], dtype='object')

          最后,我們將該索引傳遞給isin()函數,該函數會把它當成genre列表:

          movies[movies.genre.isin(counts.nlargest(3).index)].head()

          樣,在DataFrame中只剩下Drame, Comdey, Action這三種類型的電影了。

          15. 處理缺失值

          我們來看一看UFO sightings這個DataFrame:

          ufo.head()

          你將會注意到有些值是缺失的。??為了找出每一列中有多少值是缺失的,你可以使用isna()函數,然后再使用sum():

          ufo.isna().sum()
          City                  25
          Colors Reported    15359
          Shape Reported      2644
          State                  0
          Time                   0
          dtype: int64

          isna()會產生一個由True和False組成的DataFrame,sum()會將所有的True值轉換為1,False轉換為0并把它們加起來。

          類似地,你可以通過mean()isna()函數找出每一列中缺失值的百分比。

          ufo.isna().mean()
          City               0.001371
          Colors Reported    0.842004
          Shape Reported     0.144948
          State              0.000000
          Time               0.000000
          dtype: float64

          如果你想要舍棄那些包含了缺失值的列,你可以使用dropna()函數:

          ufo.dropna(axis='columns').head()

          或者你想要舍棄那么缺失值占比超過10%的列,你可以給dropna()設置一個閾值:

          ufo.dropna(thresh=len(ufo)*0.9, axis='columns').head()

          len(ufo)返回總行數,我們將它乘以0.9,以告訴pandas保留那些至少90%的值不是缺失值的列。

          16. 將一個字符串劃分成多個列

          我們先創建另一個新的示例DataFrame:

          df=pd.DataFrame({'name':['John Arthur Doe', 'Jane Ann Smith'],
                             'location':['Los Angeles, CA', 'Washington, DC']})
          df

          如果我們需要將“name”這一列劃分為三個獨立的列,用來表示first, middle, last name呢?我們將會使用str.split()函數,告訴它以空格進行分隔,并將結果擴展成一個DataFrame:

          df.name.str.split(' ', expand=True)

          這三列實際上可以通過一行代碼保存至原來的DataFrame:

          df[['first', 'middle', 'last']]=df.name.str.split(' ', expand=True)
          df

          如果我們想要劃分一個字符串,但是僅保留其中一個結果列呢?比如說,讓我們以", "來劃分location這一列:

          df.location.str.split(', ', expand=True)

          如果我們只想保留第0列作為city name,我們僅需要選擇那一列并保存至DataFrame:

          df['city']=df.location.str.split(', ', expand=True)[0]
          df

          17. 將一個由列表組成的Series擴展成DataFrame

          我們創建一個新的示例DataFrame:

          df=pd.DataFrame({'col_one':['a', 'b', 'c'], 'col_two':[[10, 40], [20, 50], [30, 60]]})
          df

          這里有兩列,第二列包含了Python中的由整數元素組成的列表。

          如果我們想要將第二列擴展成DataFrame,我們可以對那一列使用apply()函數并傳遞給Series constructor:

          df_new=df.col_two.apply(pd.Series)
          df_new

          通過使用concat()函數,我們可以將原來的DataFrame和新的DataFrame組合起來:

          pd.concat([df, df_new], axis='columns')

          18. 對多個函數進行聚合

          我們來看一眼從Chipotle restaurant chain得到的orders這個DataFrame:

          orders.head(10)

          每個訂單(order)都有訂單號(order_id),包含一行或者多行。為了找出每個訂單的總價格,你可以將那個訂單號的價格(item_price)加起來。比如,這里是訂單號為1的總價格:

          orders[orders.order_id==1].item_price.sum()
          11.56

          如果你想要計算每個訂單的總價格,你可以對order_id使用groupby(),再對每個group的item_price進行求和。

          orders.groupby('order_id').item_price.sum().head()
          order_id
          1    11.56
          2    16.98
          3    12.67
          4    21.00
          5    13.70
          Name: item_price, dtype: float64

          但是,事實上你不可能在聚合時僅使用一個函數,比如sum()。為了對多個函數進行聚合,你可以使用agg()函數,傳給它一個函數列表,比如sum()count():

          orders.groupby('order_id').item_price.agg(['sum', 'count']).head()

          這將告訴我們沒定訂單的總價格和數量。

          19. 將聚合結果與DataFrame進行組合

          我們再看一眼orders這個DataFrame:

          orders.head(10)

          如果我們想要增加新的一列,用于展示每個訂單的總價格呢?回憶一下,我們通過使用sum()函數得到了總價格:

          orders.groupby('order_id').item_price.sum().head()
          order_id
          1    11.56
          2    16.98
          3    12.67
          4    21.00
          5    13.70
          Name: item_price, dtype: float64

          sum()是一個聚合函數,這表明它返回輸入數據的精簡版本(reduced version )。

          換句話說,sum()函數的輸出:

          len(orders.groupby('order_id').item_price.sum())
          1834

          比這個函數的輸入要小:

          len(orders.item_price)
          4622

          解決的辦法是使用transform()函數,它會執行相同的操作但是返回與輸入數據相同的形狀:

          total_price=orders.groupby('order_id').item_price.transform('sum')
          len(total_price)
          4622

          我們將這個結果存儲至DataFrame中新的一列:

          orders['total_price']=total_price
          orders.head(10)

          你可以看到,每個訂單的總價格在每一行中顯示出來了。

          這樣我們就能方便地甲酸每個訂單的價格占該訂單的總價格的百分比:

          orders['percent_of_total']=orders.item_price / orders.total_price
          orders.head(10)

          20. 選取行和列的切片

          我們看一眼另一個數據集:

          titanic.head()

          這就是著名的Titanic數據集,它保存了Titanic上乘客的信息以及他們是否存活。

          如果你想要對這個數據集做一個數值方面的總結,你可以使用describe()函數:

          titanic.describe()

          但是,這個DataFrame結果可能比你想要的信息顯示得更多。

          如果你想對這個結果進行過濾,只想顯示“五數概括法”(five-number summary)的信息,你可以使用loc函數并傳遞"min"到"max"的切片:

          titanic.describe().loc['min':'max']

          如果你不是對所有列都感興趣,你也可以傳遞列名的切片:

          titanic.describe().loc['min':'max', 'Pclass':'Parch']

          21. 對MultiIndexed Series進行重塑

          Titanic數據集的Survived列由1和0組成,因此你可以對這一列計算總的存活率:

          titanic.Survived.mean()
          0.3838383838383838

          如果你想對某個類別,比如“Sex”,計算存活率,你可以使用groupby():

          titanic.groupby('Sex').Survived.mean()
          Sex
          female    0.742038
          male      0.188908
          Name: Survived, dtype: float64

          如果你想一次性對兩個類別變量計算存活率,你可以對這些類別變量使用groupby()

          titanic.groupby(['Sex', 'Pclass']).Survived.mean()
          Sex     Pclass
          female  1         0.968085
                  2         0.921053
                  3         0.500000
          male    1         0.368852
                  2         0.157407
                  3         0.135447
          Name: Survived, dtype: float64

          該結果展示了由Sex和Passenger Class聯合起來的存活率。它存儲為一個MultiIndexed Series,也就是說它對實際數據有多個索引層級。

          這使得該數據難以讀取和交互,因此更為方便的是通過unstack()函數將MultiIndexed Series重塑成一個DataFrame:

          titanic.groupby(['Sex', 'Pclass']).Survived.mean().unstack()

          該DataFrame包含了與MultiIndexed Series一樣的數據,不同的是,現在你可以用熟悉的DataFrame的函數對它進行操作。

          22. 創建數據透視表(pivot table)

          如果你經常使用上述的方法創建DataFrames,你也許會發現用pivot_table()函數更為便捷:

          titanic.pivot_table(index='Sex', columns='Pclass', values='Survived', aggfunc='mean')

          想要使用數據透視表,你需要指定索引(index), 列名(columns), 值(values)和聚合函數(aggregation function)。

          數據透視表的另一個好處是,你可以通過設置margins=True輕松地將行和列都加起來:

          titanic.pivot_table(index='Sex', columns='Pclass', values='Survived', aggfunc='mean',
                              margins=True)

          T這個結果既顯示了總的存活率,也顯示了Sex和Passenger Class的存活率。

          最后,你可以創建交叉表(cross-tabulation),只需要將聚合函數由"mean"改為"count":

          titanic.pivot_table(index='Sex', columns='Pclass', values='Survived', aggfunc='count',
                              margins=True)

          這個結果展示了每一對類別變量組合后的記錄總數。

          23. 將連續數據轉變成類別數據

          我們來看一下Titanic數據集中的Age那一列:

          titanic.Age.head(10)
          0    22.0
          1    38.0
          2    26.0
          3    35.0
          4    35.0
          5     NaN
          6    54.0
          7     2.0
          8    27.0
          9    14.0
          Name: Age, dtype: float64

          它現在是連續性數據,但是如果我們想要將它轉變成類別數據呢?

          一個解決辦法是對年齡范圍打標簽,比如"adult", "young adult", "child"。實現該功能的最好方式是使用cut()函數:

          pd.cut(titanic.Age, bins=[0, 18, 25, 99], labels=['child', 'young adult', 'adult']).head(10)
          0    young adult
          1          adult
          2          adult
          3          adult
          4          adult
          5            NaN
          6          adult
          7          child
          8          adult
          9          child
          Name: Age, dtype: category
          Categories (3, object): [child < young adult < adult]

          這會對每個值打上標簽。0到18歲的打上標簽"child",18-25歲的打上標簽"young adult",25到99歲的打上標簽“adult”。

          注意到,該數據類型為類別變量,該類別變量自動排好序了(有序的類別變量)。

          24. 更改顯示選項

          我們再來看一眼Titanic 數據集:

          titanic.head()

          注意到,Age列保留到小數點后1位,Fare列保留到小數點后4位。如果你想要標準化,將顯示結果保留到小數點后2位呢?

          你可以使用set_option()函數:

          pd.set_option('display.float_format', '{:.2f}'.format)
          
          titanic.head()

          set_option()函數中第一個參數為選項的名稱,第二個參數為Python格式化字符。可以看到,Age列和Fare列現在已經保留小數點后兩位。注意,這并沒有修改基礎的數據類型,而只是修改了數據的顯示結果。

          你也可以重置任何一個選項為其默認值:

          pd.reset_option('display.float_format')

          對于其它的選項也是類似的使用方法。

          25. Style a DataFrame

          上一個技巧在你想要修改整個jupyter notebook中的顯示會很有用。但是,一個更靈活和有用的方法是定義特定DataFrame中的格式化(style)。

          我們回到stocks這個DataFrame:

          stocks

          我們可以創建一個格式化字符串的字典,用于對每一列進行格式化。然后將其傳遞給DataFrame的style.format()函數:

          format_dict={'Date':'{:%m/%d/%y}', 'Close':'${:.2f}', 'Volume':'{:,}'}
          
          stocks.style.format(format_dict)

          注意到,Date列是month-day-year的格式,Close列包含一個$符號,Volume列包含逗號。

          我們可以通過鏈式調用函數來應用更多的格式化:

          (stocks.style.format(format_dict)
           .hide_index()
           .highlight_min('Close', color='red')
           .highlight_max('Close', color='lightgreen')
          )

          我們現在隱藏了索引,將Close列中的最小值高亮成紅色,將Close列中的最大值高亮成淺綠色。

          這里有另一個DataFrame格式化的例子:

          (stocks.style.format(format_dict)
           .hide_index()
           .background_gradient(subset='Volume', cmap='Blues')
          )

          Volume列現在有一個漸變的背景色,你可以輕松地識別出大的和小的數值。

          最后一個例子:

          (stocks.style.format(format_dict)
           .hide_index()
           .bar('Volume', color='lightblue', align='zero')
           .set_caption('Stock Prices from October 2016')
          )

          現在,Volumn列上有一個條形圖,DataFrame上有一個標題。請注意,還有許多其他的選項你可以用來格式化DataFrame。

          額外技巧:Profile a DataFrame

          假設你拿到一個新的數據集,你不想要花費太多力氣,只是想快速地探索下。那么你可以使用pandas-profiling這個模塊。在你的系統上安裝好該模塊,然后使用ProfileReport()函數,傳遞的參數為任何一個DataFrame。它會返回一個互動的HTML報告:

          • 第一部分為該數據集的總覽,以及該數據集可能出現的問題列表;
          • 第二部分為每一列的總結。你可以點擊"toggle details"獲取更多信息;
          • 第三部分顯示列之間的關聯熱力圖;
          • 第四部分為缺失值情況報告;
          • 第五部分顯示該數據及的前幾行。

          使用示例如下(只顯示第一部分的報告):

          import pandas_profiling
          pandas_profiling.ProfileReport(titanic)

          本文轉載自數據STUDIO,作者云朵君,三年互聯網數據分析經驗,擅長Excel、SQL、Python、PowerBI數據處理工具,數據可視化、商業數據分析技能,統計學、機器學習知識,持續創作數據分析內容,點贊關注,不迷路。

          .首先我們新建一個 400*400的文檔,設置前景色81C1E9、背景色2785DA,線性漸變垂直拉制背景。

          2.按F5進入筆刷調板。

          畫筆筆尖形狀:筆尖類型 柔角100 ,直徑 100Px,間距 25。

          形狀動態:大小抖動 100%,最小直徑 20%,角度抖動 20%。

          散布:兩軸 120%,數量 5 ,數量抖動 100%。

          紋理:圖樣 云彩(128*128 灰度),縮放 100%,模式 顏色加深,深度 100%。

          其他動態:不透明度抖動 50%,流量抖動 20%。

          ==============================

          公眾號:春樹鎮

          研究討論:互聯網技術,php開發,網站建議,app開發,html5開發,設計,小說,電影。

          戶:一家云集

          行業:建材

          產品/解決方案:建材B2B供應鏈系統


          項目背景

          ——

          建材行業擁有一個巨大的市場,但建材行業的平臺運營效果不佳,主要問題在于建材行業除了建材采購之外還需要施工服務,而且從業人員文化素質普遍偏低,行業品類多。【數商云】基于以上的商業痛點,通過主流的開發技術為企業打造的是一個行業撮合交易的平臺,提供深度的建材采購,用工平臺服務,一鍵式完成從采購至用工的門店與生產廠家的供需服務。

          方案亮點

          ——

          建材電子商務采購管理系統解決方案可以為企業實現集團物資的全流程管理,從需求計劃、招標(競標、詢比價)、采購合同、采購到貨、采購結算、統計分析等方面進行全面細致的物資采購管理與控制。

          ● 提供入駐建材電商網站資格的功能

          供應商注冊商家,提交企業資質,建材B2B電商平臺對其資質進行審核,商家開通店鋪,上架商品,采購商在線采購。

          ● 實現精細化運營服務功能

          接入自動化營銷系統,基于全鏈數據分析,幫助建材B2B供應鏈平臺拓展上下游營銷渠道,精準獲取客戶,個性化維系客戶,科學決策,實現平臺精細化運營。

          ● 提供B2B電子合同功能

          平臺通過CA的數字認證技術和數字證書產品來實現有效的電子簽名,讓電子合同符合《電子簽名法》,具備防篡改,抗抵賴的特性,從而擁有和紙質合同同等的法律效力。

          ● 多渠道系統與家B2B電子商務網站對接整合

          采用html5技術,移動端與PC端完美的結合,會員、商品、訂單、積分、預存款等功能與PC端無B2B商城網站實現無縫對接。

          實施價值

          ——

          基于電子商務的建材物資采購平臺使企業領導層可以方便地了解每一種物資的價格、數量、庫存情況,合同的執行情況,資金的使用情況以及供應商情況等各種信息,針對物資采購過程中出現的問題,快速反應,有效的對領導層決策提供數據支撐。

          本文由數商云?云朵匠原創,商業轉載請聯系作者獲得授權,非商業轉載請標明:數商云原創


          主站蜘蛛池模板: 无码精品人妻一区二区三区免费 | 中文字幕无码不卡一区二区三区 | 亚洲高清一区二区三区| 精品无码中出一区二区| 久久亚洲色一区二区三区| 成人无码一区二区三区| 国产成人一区二区动漫精品 | 久久se精品一区精品二区国产| 欧洲精品码一区二区三区免费看 | 国产免费播放一区二区| 色多多免费视频观看区一区| 国产一国产一区秋霞在线观看| 精品一区二区三区无码视频| 国内精品视频一区二区三区八戒| 日韩精品一区二区三区在线观看| 蜜芽亚洲av无码一区二区三区| 一区二区在线视频| 国产一区风间由美在线观看| 曰韩人妻无码一区二区三区综合部| 国产一区二区三区在线观看影院| 夜精品a一区二区三区| 国产免费一区二区三区VR| 老熟妇仑乱视频一区二区| 精品久久国产一区二区三区香蕉| 91在线一区二区| 日韩精品一区二区三区在线观看l| 日本在线电影一区二区三区| 日本无码一区二区三区白峰美 | 亚洲国产日韩在线一区| 国产亚洲3p无码一区二区| 中字幕一区二区三区乱码| 国产日韩综合一区二区性色AV| 亚洲av福利无码无一区二区| 在线精品亚洲一区二区| 制服丝袜一区在线| 亚洲AⅤ无码一区二区三区在线| 国产精品视频一区二区三区| 国产精品 一区 在线| 国产精品亚洲产品一区二区三区 | 国产午夜精品一区二区三区小说| 内射女校花一区二区三区|