pandas常用命令-學習整理


一、數據導入導出

1、設置最大10行:pd.options.display.max_rows = 10

2、以字典的格式生成數據框:pd.DataFrame({'var1':1,'var2':[1,2,3,],'var3':['a','b','c'],'var4':'zzzz','var5':'900})

3、以列表的格式生成數據框:pd.DataFrame(data=[['a','b','c'],['A','B','C']],columns=['var1','var2','var3'])

4、讀取文本格式數據文件:

  4.1 讀取csv文件數據:pd.read_csv('xx.csv',encoding='utf-8',hearder=0,names=[1,2,3,4,5,6,7,8],usecols=[2,4,7])

    參數解釋:

      filepath_or_buffer : 路徑 URL 可以是http, ftp, s3, 和 file.

      sep: 指定分割符,默認是’,’C引擎不能自動檢測分隔符,但Python解析引擎可以

      delimiter: 同sep

      delimiter_whitespace: True or False 默認False, 用空格作為分隔符等價於spe=’\s+’如果該參數被調用,則delimite不會起作用

      header: 指定第幾行作為列名(忽略注解行),如果沒有指定列名,默認header=0;

      names:指定列名,如果文件中不包含header的行,應該顯性表示header=None

      index_col: 默認為None 用列名作為DataFrame的行標簽。如果讀取某文件,該文件每行末尾都有帶分隔符,考慮使用index_col=False使panadas不用第一列作為行的名稱。

      usecols: 默認None 可以使用列序列也可以使用列名,如 [0, 1, 2] or [‘foo’, ‘bar’, ‘baz’],選取的列

      as_recarray:默認False , 將讀入的數據按照numpy array的方式存儲,0.19.0版本后使用 pd.read_csv(…).to_records()。 注意:這種方式讀入的na數據不是顯示na,而是給以個莫名奇妙的值

      squeeze: 默認為False, True的情況下返回的類型為Series

      prefix:默認為none, 當header =None 或者沒有header的時候有效,例如’x’ 列名效果 X0, X1, …

      mangle_dupe_cols :默認為True,重復的列將被指定為’X.0’…’X.N’,而不是’X’…’X’。如果傳入False,當列中存在重復名稱,則會導致數據被覆蓋。

      dtype: E.g. {‘a’: np.float64, ‘b’: np.int32} 指定數據類型

      engine: {‘c’, ‘python’}, optional 選擇讀取的引擎目前來說C更快,但是Python的引擎有更多選擇的操作

      skipinitialspace: 忽略分隔符后的空格,默認false,

      skiprows: list-like or integer or callable, default None 忽略某幾行或者從開始算起的幾行

      skipfooter: 從底端算起的幾行,不支持C引擎

      nrows: int 讀取的行數

      na_values: 默認None NaN包含哪些情況, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’, ‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’. 都表現為NAN

      keep_default_na: 如果na_values被定義,keep_default_na為False那么默認的NAN會被改寫。 默認為True

      na_filter: 默認為True, 針對沒有NA的文件,使用na_filter=false能夠提高讀取效率

      skip_blank_lines 默認為True,跳過blank lines 而且不是定義為NAN

      thousands 千分位符號,默認‘,’

      decimal 小數點符號,默認‘.’

      encoding: 編碼方式

      memory_map如果為filepath_or_buffer提供了文件路徑,則將文件對象直接映射到內存上,並直接從那里訪問數據。使用此選項可以提高性能,因為不再有任何I / O開銷。

      low_memory 默認為True 在塊內部處理文件,導致分析時內存使用量降低,但可能數據類型混亂。要確保沒有混合類型設置為False,或者使用dtype參數指定類型。請注意,不管怎樣,整個文件都讀入單個DataFrame中,請使用chunksize或iterator參數以塊形式返回數據。 (僅在C語法分析器中有效)

  4.2 讀取excel文件數據:pd.read_excel("111.xlsx",sheet_name=0)

    參數解釋:    

      io :excel 路徑;

      sheetname:默認是sheetname為0,返回多表使用sheetname=[0,1],若sheetname=None是返回全表 。注意:int/string返回的是dataframe,而none和list返回的是dict of dataframe。

      header :指定作為列名的行,默認0,即取第一行,數據為列名行以下的數據;若數據不含列名,則設定 header=None;

      skiprows:省略指定行數的數據

      skip_footer:省略從尾部數的行數據

      index_col :指定列為索引列,也可以使用 u’string’

      names:指定列的名字,傳入一個list數據

  4.3 讀取sas文件數據:pd.read_sas("air.sas7bdat") 

  4.4 讀取數據庫數據:

    from sqlalchemy import create_engine

    eng = create_engine('mysql+pymysql://root:123123@47.93.148.185/lianxi_data?charset=utf8')

    df1=pd.read_sql("cp",con=eng,index_col='id')

    參數解釋:

      sql:SQL命令字符串

      con:連接sql數據庫的engine,一般可以用SQLalchemy或者pymysql之類的包建立

      index_col: 選擇某一列作為index

      coerce_float:非常有用,將數字形式的字符串直接以float型讀入

      parse_dates:將某一列日期型字符串轉換為datetime型數據,與pd.to_datetime函數功能類似。可以直接提供需要轉換的列名以默認的日期形式轉換,也可以用字典的格式提供列名和轉換的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。

      columns:要選取的列。一般沒啥用,因為在sql命令里面一般就指定要選擇的列了

      chunksize:如果提供了一個整數值,那么就會返回一個generator,每次輸出的行數就是提供的值的大小。

5、保存數據

  5.1 保存為csv文件:df.to_csv("111.txt")

    參數解釋:

      filepath_or_buffer:要保存的文件路徑

      sep=',, :列分隔符

      columns :需要導出的變量列表

      header = True :指定導出數據的新變量名,可直接提供

      listindex =True :是否導出索引

      mode ='w' : Python寫模式,讀寫方式:I, r+ , w, w+ , a , a+

      encoding ='utf-8, :默認導出的文件編碼格式)

  5.2 保存為excel文件:df.to_excel("111.xlsx")

    參數解釋:

      filepath_orbuffer:要讀入的文件路徑

      sheet_name = 'Sheet1' :要保存的表單名稱

  5.3 保存到sql數據庫中:df.to_sql(name="wuwu",con=eng,if_exists='append',index=False)

    參數解釋:

      name :將要存儲數據的表名稱

      con : SQLAlchemy引擎/DBAP12連接引擎名稱

      if_exists:( 'fail', 'replace', append), default fail

        fail :不做任何處理(不插入新數據) 

        Dreplace :刪除原表並重建新表

        append :在原表后插入新數據

      index =True :是否導出索引

二、變量列操作

1、查看數據框的大小:df.shape

2、查看數據框的基本信息:df.info()

3、查看數據框前10條記錄:df.head(10)

4、查看數據框后10條記錄:df.tail(10)

5、查看列表的變量名:df.columns

6、修改列名,inplace表示是否替換原數據框:df.rename(columns={'title':'title1','content':'content1'},inplace=True)

7、篩選變量列:df[ ['content','title'] ] 或者 df.iloc[:,0:2]

8、刪除變量列:df.drop(columns={'content1'},inplace=True)

9、查看數據框的數據類型:df.dtypes

10、轉換數據框數據類型:df.astype('str',errors='ignore')

11、轉換某一列數據類型:df.id.astype('int')

三、索引操作

1、建立數據框的時候建立索引:pd.DataFrame({'var1':1,'var2':'1,2,3','var3':'qwe','var4':'asd'},index=['a','b','c','d'])

2、指定列為索引:df.set_index(keys='var2',append=True,inplace=True)

  參數解釋:df.set_index(

      keys :被指定為索引的列名,復合索引用list格式提供

      drop=True :建立索引后是否刪除該列

      append =False :是否在原索引基礎上添加索引,默認是直接替換原索引

      vinplace =False :是否直接修改原數據框)

3、將索引還原為變量列:df.reset_index(level=['var2'],inplace=True)

  參數解釋:df.reset_index(

    drop = False:是否將索引直接刪除,而不是還原為變量列

    inplace = False :是否直接修改原數據框

    level= None :對於多重索引,確定轉換哪個級別為變量,需要之前做過索引的)

4、修改索引名:df.index.names=['id','var5']

5、修改索引值:df.index=[[1,2,4,5],[10,9,8,7]]

6、刪除設置的索引:df.reset_index(inplace=True,drop=True)

7、索引排序:df.sort_index(level='id',ascending=False,inplace=True)

  參數說明:df.sort index(

      level : (多重索引時)指定用於排序的級別順序號/名稱

      ascending = True :是否為升序排列,多列時以表形式提供

      inplace = False:

      naposition = 'last' :缺失值的排列順序, first/last)

8、強行更新索引:df.reindex(['a','b','c','d','r'],method='ffill')

        df.reindex(['a','b','c','d','r'],fill_value="不知道")

  參數說明:df.reindex(

    labels :類數組結構的數值,將按此數值重建索引,非必需

    axis :針對哪個軸進行重建('index', 'columns') or number (0, 1).

    copy = True :建立新對象而不是直接更改原df/series

    level :考慮被重建的索引級別

    缺失數據的處理方式

    method :針對已經排序過的索引,確定數據單元格無數據時的填充方法,非必需

      pad / ffill:用前面的有效數值填充

      backfill / bfill:用后面的有效數值填充

      nearest:使用最接近的數值進行填充

    Fill value =np.NaN :將缺失值用什么數值替代

    limit =None :向前/向后填充時的最大步長

四、行操作

1、索引排序:df.sort_index(level='id',ascending=False,inplace=True)

2、列值排序:df.sort_values(by='var2',ascending=False,inplace=True)

3、按照絕對位置進行行篩選:

  1)不包括右側邊界值:df.iloc[0:1]

  2)列表的形式,包含第0、1行:df.iloc[[0,1]]

  3)篩選列:df.iloc[:,0:2]

  4)按照索引值進行篩選,亂序則不可用:df.loc['3':'1',['var2','var3']]

  5)篩選特定序列第三、四列:df1.loc[[('3'),('4')]]

  6)針對多重索引的行篩選(不常用):df1.xs('1',drop_level=False)

4、條件篩選(var1列中大於2的數列):df[df.var1>2]

5、列表篩選,isin的結果是bool類型數據(找出var2列有值為1和3的行):df.var2.isin([1,3])

6、索引的列表篩選,isin的結果是bool類型數據:df.index.isin(['1','2'])

7、類sql語句篩選(id列大於等於3,var1列等於1的行):df.query("id>='3' and var1==1 ")

  參數說明:df.query(

      expr:類sQL語句表達式可以使用前綴,.引用環境變量等號為==,而不是=

      注意:目前還不支持like語句

      inplace = False :是否直接替換原數據框)

8、刪除空值行:df.dropna(axis=0, how='any', inplace=True)

  參數說明:

      axis:0-行操作(默認),1-列操作

      how:any-只要有空值就刪除(默認),all-全部為空值才刪除

      inplace:False-返回新的數據集(默認),True-在願數據集上操作)

9、刪除行:df.drop(label=var1, axis=0, inplace=True)

  參數說明:

    labels 就是要刪除的行列的名字,用列表給定

    axis 默認為0,指刪除行,因此刪除columns時要指定axis=1;

    index 直接指定要刪除的行

    columns 直接指定要刪除的列

    inplace=False,默認該刪除操作不改變原數據,而是返回一個執行刪除操作后的新dataframe;

五、變量操作

1、添加新列:df['var5']=[10,9,8,7]

2、列的四則運算:df.var5*df.var2

3、單多個列,求平方根:numpy.sqrt(df.var6)

      df.var5.apply(math.sqrt)

  參數說明:df.apply(

    func:希望對行/列執行的函數表達式

    axis =o/'index':針對每列進行計算;l/'columns :針對每行進行計算

4、多個列,求平方根,這個會形成新的表:df[['var1','var2']].applymap(math.sqrt)

5、指定插入列:df.insert(1,column="var11",value=['a','b','c','d'])

  參數說明:df.insert(

    1oc :插入位置的索引值, o <= loc <= len(columns)

    colunn :插入的新列名稱

    value : Series或者類數組結構的變量值

    allow_duplicates =False :是否允許新列重名)

6、查找變量:df[df.var1.isin(['1'])]

7、數值替換:

    單值替換:df.loc[1,'var11']='不'

         df.loc[df[df.var6<20].index,['var1','var11']]='hate'

         df.loc[df.query("var2 ==4").index,['var1','var11']]='you'

         df.var1.replace(1,"love",inplace = True)

    多值替換-列表:df.var11.replace(['a','c'],['我','知'],inplace = True)

    多值替換-字典:df.var11.replace({'我':'a','知':'c'},inplace = True)

      參數說明:df.replace(

         to_replace = None :將被替換的原數值,所有嚴格匹配的數值將被用value替換可以是str/regex/list/dict/Series/numeric/None

         value =None :希望填充的新數值

         inplace = False)

8、生成啞變量:pd.get_dummies(df1.var2,prefix='pre')

        pd.get_dummies(df1,prefix='pre',columns=['var2'])

    參數說明:pd.get dummies(

      data :希望轉換的數據框/變量列

      prefix = None :啞變量名稱前綴

      prefix_sep ='.:前綴和序號之間的連接字符,設定有prefix或列名時生效

      dummy_na = False :是否為NaNs專門設定一個啞變量列

      columns =None :希望轉換的原始列名,如果不設定,則轉換所有符合條件的列

      drop-first =False :是否返回k-1個啞變量,而不是k個啞變量)#返回值為數據框)

9、數值分段,相當於多一列標簽:df['cls']=pd.cut(df.var2,bins=[1,3,6],right=False)

    參數說明:pd.cut(

        x:希望進行分段的變量列名稱

        bins :具體的分段設定

          int :被等距等分的段數

          sequence of scalars :具體的每一個分段起點,必須包括最值,可不等距

        right =True :每段是否包括右側界值

        labels -None :為每個分段提供自定義標簽

        include_lowest = False :第一段是否包括最左側界值,需要和right參數配合)

六、數據拆分

1、按照var1列進行分組:dfg = df.groupby(['var1'])

   參數說明:df.groupby(

      by:用於分組的變量名/函數

      axis =o:對行作拆分

      level = None :相應的軸存在多重索引時,指定用於分組的級別

      as_index=True :在結果中將組標簽作為索引

      sort = True :結果是否按照分組關鍵字進行排序)

2、查看分組的詳細信息:dfg.describe();篩選其中一列並輸出詳細信息:dfg['var1'].describe()

  參數說明:df.describe(

    percentiles :需要輸出的百分位數,列表格式提供,如[.25, .5, .75]

    include = 'None' :要求納入分析的變量類型白名單

      None (default) :只納入數值變量列

      A list-like of dtypes[] :列表格式提供希望納入的類型

      "all' :全部納入

    exclude :要求剔除出分析的變量類型黑名單,選項同上)

3、分組的平均數值:dfg.mean()

4、顯示var1中值為a的數據:dfg.get_group('a')

5、分組匯總:dfg.agg('sum') == df.var1.agg(numpy.sum)

  參數說明:df.agg(

      count() Number of non-null observations  總個數

      size () group sizes  組大小

      sum() Sum of values  值總和

      mean () Mean of values  值的均值

      median() Arithmetic median of values   算術中位數

      min() Minimum  最小值

      max() Maximum  最大值

      std() Unbiased standard deviation   無偏標准偏差

      var() Unbiased variance  均方差

      skew () Unbiased skewness (3rd moment)   無偏偏態

      kurt() Unbiased kurtosis (4th moment)   無偏峰度

      quantile() Sample quantile (value at 8)   樣本分位數

      apply() Generic apply  通用應用

      cov() Unbiased covariance (binary)   無偏協方差

      corre() correlation (binary))

6、分類變量的頻數統計(即統計行值相同個數):pd.value_counts(df.var1)

  參數說明:pd.value_counts(

    normalize = False :是否返回構成比而不是原始頻數

    sort =True :是否按照頻數排序(否則按照原始順序排列)

    ascending = False :是否升序排列

    dropna =True:結果中是否包括NaN)

6、交叉表,前面的為行名,后面的為列名:pd.crosstab(df1.var2,df1.var5)

  或者:df.pivot_table(index=['var1','var2'],columns='var5',values='var4',aggfunc=sum)

    參數說明:df.pivot_table(

      行列設定

        index / columns :行變量/列變量,多個時以list形式提供

      單元格設定

        values :在單元格中需要匯總的變量列,可不寫

        aggfunc =numpy.mean:相應的匯總函數

      匯總設定

         normalize =0 :求百分比

        margins =False :是否加入行列匯總

        margins_narde ='All' :匯總行/列的名稱

      缺失值處理

        fill-value =None :用於替換缺失值的數值    

        dropna = True:

                     

7、unstack() 方法可以快速將一個多級索引的 Series 轉化為普通索引的 DataFrame(復雜),stack則可以實現將列轉化為索引(簡單):

  參數說明:df.stack(

      level=-1:需要處理的索引級別,默認為全部, int/string/list

      dropna = True :是否刪除為缺失值的行)

8、長型和寬型數據的互轉:df.T

9、多數據的縱向合並:df.append([df2,df2[:1],df2[3:]],ignore_index=True)

  參數說明:df.append(

      other :希望添加的DF/series/字典/上述對象的列表使用列表方式,就可以實現一次合並多個新對象

      ignore_index = False :添加時是否忽略索引

      verify_integrity = False :是否檢查索引值的唯一性,有重復時報錯)

10、多數據的橫向合並(索引對應列名的合並):pd.merge(df1s,df3s,left_index=True,right_on='var5')

  參數說明:pd.merge(

      left :需要合並的左側DF

      right :需要合並的右側DF

      how ='inner' :具體的連接類型('left', 'right', 'outer', 'inner')

    兩個DF的連接方式

      on :用於連接兩個DF的關鍵變量(多個時為列表) ,必須在兩側都出現

      left-on :左側DF用於連接的關鍵變量(多個時為列表)

      right_on :右側DF用於連接的關鍵變量(多個時為列表)

      left_index = False :是否將左側DF的索引用於連接

      right_index =False :是否將右側DF的索引用於連接

    其他附加設定

      sort = False :是否在合並前按照關鍵變量排序(會影響合並后的案例順序)

      suffixes :重名變量的處理方式,提供長度為2的列表元素,分別作為后綴suffixes=('x', 'y')

      copy = True      

      indicator = False :在結果DF中增加'-merge'列,用於記錄數據來源,也可以直接提供相應的變量列名

      categorical類型,取值: 'left_only', 'right_only', 'both'

    validate =None :核查合並類型是否為所指定的情況

      'one_to_one' or '1:1'

      '1one to many' or '1:m' 

      'many_to_one' or 'm:1' 

      'many tomany' or 'm:m'(實際上不做檢查)   

11、其他合並命令;縱向:pd.concat([df1s,df3s])

  需要根據索引拼接,橫向:pd.concat([df1s,df3s],axis=1)

七、數據清洗 

1、數據框級別判斷是否為空數據isna,判斷為有數據notna:bj.isna()  bj.notna()

2、可用numpy中的nan賦值為空值:bj.Year=np.nan

3、行列級別檢查缺失值:bj.any(0)

  參數說明:df.any(

      axis: {index (0), columns (1)}

      skipna = True :檢查時是否忽略缺失值

      level =None :多重索引時指定具體的級別)

4、缺失值填充:bj.fillna('未知',limit=100)

  參數說明:df.fillna(

    value :用於填充缺失值的數值

      也可以提供dict/series/DataFrame以進一步指明哪些索引1/列會被替換

      不能使用list

    method = None : 默認值 None ; 在Series中使用方法填充空白

      (‘backfill’, ‘bfill’向前填充,‘pad’, ‘ffill’向后填充)

    limit= None :指定了method后設定具體的最大填充步長, >此步長不能填充

    axis: {0 or 'index', 1 or 'columns'} 

    inplace = False)

5、缺失值的刪除:bj.dropna(axis=0,how='all')

  參數說明:df.dropna(

    axis =o: {0 or 'index', 1 or 'columns'}

    how = any : ('any', 'all'}

      any :任何一個為NA就刪除

      all :所有的都是NA才刪除

    thresh =None :刪除的數量國值, int

    subset :希望在處理中包括的行/列子集

    inplace = False) 

6、行查重dup為bool類型:bj['dup']=bj.duplicated(['Year'])

  索引查重:bj.index.duplicated()

7、刪除重復的行,keep='first';(只刪除第一個),'last'(只刪除最后一個),'Flase'(有重復的全部都刪除):bj.drop_duplicates(['Year'],keep=False)

8、利用查重標識直接刪除:bj[~bj.duplicated(['Year'])]

八、日期時間

1、單列時間轉換:pd.to_datetime(df['var1'],errors='ignore',format='%Y-%m-%d %H:%M')

  多列時間轉換:pd.to_datetime(bj[['Year','Month','Day','Hour']],errors='ignore',format='%Y-%m-%d %H:%M')

  參數說明:pd.to_datetime(

    arg:需要轉換為Timestamp類的數值integer, float, string, datetime, list, tuple, 1-d array, series

    errors ='raise': ('ignore', 'raise', 'coerce'}•

      raise',拋出錯誤'

      coerce',設定為NaT

      ignore',返回原值e

      then invalid parsing will return the input短日期的解釋方式:類似"10/11/12"這樣的數據如何解釋

    dayfirst ='False' :數值是否day在前

    yearfirst ='False' :數值是否year在前,該設定優先

    box =True :是否返回為DatetimeIndex, False時回ndarray數

    format =None :需要轉換的字符串格式設定

2、普通建立時間索引:bj.set_index(pd.to_datetime(bj['Date ']))

  建立時間索引:pd.date_range(end='2020-12-31',periods=15,freq="M")

    參數說明:pd.date_range(

      start /end =None:日期時間范圍的起點/終點,均為類日期時間格式的字符串1數據

      periods = None :准備生成的總記錄數

      freg ='D' :生成記錄時的時間周期,可以使用字母和數值數的組合,如'5H

      name = None :生成的DatetimeIndex對象的名稱)

3、按照時間的查找數據:bj["2008-11-1":'2008-11-5']

4、取索引時間的一部分:bj["2008-11-1":'2008-11-5 9:00']

5、按照三天為一個單位做一個組合的均值:bj1.resample('3D').mean()

6、序列數值的平移(總行不變在前面添加3個空白行):bj.shift(3)

  參數說明:df.shif(

    periods =1 :希望移動的周期數

    freg :時間頻度字符串

    axis =o)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM