pandas-對dataframe的操作,對行列的增加刪除修改等操作

  Pandas讀取CSV文件主要用到的函數爲:pandas.read_csv()

  1. 函數原型:
  2. pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer',
  3. names=None, index_col=None, usecols=None, squeeze=False,
  4. prefix=None, mangle_dupe_cols=True, dtype=None, engine=None,
  5. converters=None, true_values=None, false_values=None,
  6. skipinitialspace=False, skiprows=None, nrows=None,
  7. na_values=None, keep_default_na=True, na_filter=True,
  8. verbose=False, skip_blank_lines=True, parse_dates=False,
  9. infer_datetime_format=False, keep_date_col=False, date_parser=None,
  10. dayfirst=False, iterator=False, chunksize=None, compression='infer',
  11. thousands=None, decimal=b'.', lineterminator=None, quotechar='"',
  12. quoting=0, escapechar=None, comment=None, encoding=None,
  13. dialect=None, tupleize_cols=None, error_bad_lines=True,
  14. warn_bad_lines=True, skipfooter=0, doublequote=True,
  15. delim_whitespace=False, low_memory=True, memory_map=False,
  16. float_precision=None)
  17. 常用參數:
  18. filepath_or_buffer : 類型str,代表CSV文件地址。
  19. sep : 類型str, 默認值爲‘,’,用於指定分隔符。如果不指定參數,則會嘗試使用逗號分隔。
  20. header : 類型爲int或者int的列表,它指定用來作爲列名行號,然後數據從行號的下一行開始讀取。 默認情況下header是根據參數names(如下)
  21. 來推斷header的值。如果names爲None,則等價於header=0,默認把文件中第一行作爲列名,數據從第一行開始讀取。如果names顯示地傳入,
  22. 則等價於header=None,則數據從0行開始讀取。如果傳入header=0,names不爲None,則將替換原有的列名。header參數可以是一個list。
  23. 例如:[0,1,3],這個list表示將文件中的這些行作爲列標題(意味着每一列有多個標題),介於中間的行將被忽略掉(例如本例中的2
  24. 本例中的數據1,2,4行將被作爲多級標題出現,第3行數據將被丟棄,dataframe的數據從第5行開始。)。
  25. names : 一個數組, 默認爲None。列名列表,如果數據文件中沒有列標題行,就需要執行header=None
  26. usecols : 一個數組, 默認爲None,返回數據列一個子集。如果傳入字符,則列名需要與表中列名對應。如果傳入整數列表,則表示列的索引值。
  27. 例如:usecols有效參數可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。
  28. prefix : 類型str, 默認爲None。在沒有列標題時,給列添加前綴。例如:添加‘X’ 成爲 X0, X1, ...
  29. engine : {‘c’, ‘python’},可選。使用的分析引擎。可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
  30. nrows : 類型int, 默認爲None。需要讀取的行數(從文件頭開始算起)。
  31. iterator : 類型boolean, 默認爲False。返回一個TextFileReader 對象,以便逐塊處理文件。

  如果CSV文件過大,則可以分塊讀取CSV文件,比如:

  1. import pandas as pd
  2. reader = pd.read_csv('./train.csv', iterator=True)
  3. try:
  4. df = reader.get_chunk(70000) # 讀取70000行數據
  5. except StopIteration:
  6. print ("Iteration is stopped.")
  7. print (df.info())

 2、DataFrame保存到CSV

  將DataFrame保存到CSV文件的函數爲:DataFrame.to_csv()

  1. 函數原型:
  2. DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None,
  3. header=True, index=True, index_label=None, mode='w', encoding=None,
  4. compression=None, quoting=None, quotechar='"', line_terminator='\n',
  5. chunksize=None, tupleize_cols=None, date_format=None, doublequote=True,
  6. escapechar=None, decimal='.')
  7. 常用參數:
  8. path_or_buf : 文件路徑,如果沒有指定則將會直接返回字符串的 json
  9. sep : 輸出文件的字段分隔符,默認爲 “,”
  10. na_rep : 用於替換空數據的字符串,默認爲''
  11. float_format : 設置浮點數的格式(幾位小數點)
  12. columns : 要寫的列
  13. header : 是否保存列名,默認爲 True ,保存
  14. index : 是否保存索引,默認爲 True ,保存

3、增加DataFrame數據

(1)增加一列數據

  1. print df2
  2.    col1  col2  col3
  3. a     1     2     3
  4. b     4     5     6
  5. df2['col4'] = ['cnn','rnn'# 對DataFrame對象進行列擴充
  6. print df2
  7.     col1  col2  col3 col4
  8. a     1     2     3  cnn
  9. b     4     5     6  rnn
  10. df2['col5'] = pd.DataFrame(['MachineLearning','DeepLearning'],index=['a','b'])
  11. print df2   # 也可以通過一個新的DataFrame對象來定義一個新列,索引自動對應
  12.      col1  col2  col3 col4       col5
  13. a     1     2     3  cnn  MachineLearning
  14. b     4     5     6  rnn    DeepLearning
  15. df2['col4'] = 1
  16. print df2
  17. col1 col2 col3 col4
  18. a 1 2 3 1
  19. b 4 5 6 1

(2)增加一行數據 

  1. df
  2. col1 col2 col3
  3. 0 1 2 3
  4. 1 4 5 6
  5. new_line = [7,8,9]
  6. df.loc[3]= new_line
  7. print (df)
  8. col1 col2 col3
  9. 0 1 2 3
  10. 1 4 5 6
  11. 3 7 8 9

 但是十分注意的是,這樣實際是改的操作,如果 df.loc [index] 中的index已經存在,則新的值會覆蓋之前的值。可以使用DataFrame.append()方法添加。例如:

  1. df1 = pd.DataFrame([[1,2,3],[4,5,6]],columns=['col1','col2','col3'])
  2. df2 = pd.DataFrame([[7,8,9],[10,11,12]],columns=['col1','col2','col3'])
  3. print (df1)
  4. print (df2)
  5. col1 col2 col3
  6. 0 1 2 3
  7. 1 4 5 6
  8. col1 col2 col3
  9. 0 7 8 9
  10. 1 10 11 12
  11. df3 = df1.append(df2, ignore_index=True)
  12. df4 = df1.append(df2)
  13. print (df3)
  14. print (df4)
  15. col1 col2 col3
  16. 0 1 2 3
  17. 1 4 5 6
  18. 2 7 8 9
  19. 3 10 11 12
  20. col1 col2 col3
  21. 0 1 2 3
  22. 1 4 5 6
  23. 0 7 8 9
  24. 1 10 11 12

4、刪除DataFrame數據

(1)刪除一列數據del 、DataFrame.drop()

  1. del df['a'#刪除dataframe中指定的列,這個是直接影響當前的dataframe,注意 del不是函數,是python中的內置語句,沒有返回值.
  2. df.drop(['a'],axis=1#刪除指定的列,與上面的區別是不會影響原來的dataframe,drop方法會返回一個刪除了指定列的新的dataframe.
  3. # 這裏如果不加axis=1,則默認是刪除行,比如
  4. df
  5. col1 col2 col3
  6. a 1 2 3
  7. b 4 5 6
  8. c 7 8 9
  9. df.drop(['a'], inplace=True)
  10. print (df)
  11. col1 col2 col3
  12. b 4 5 6
  13. c 7 8 9

(2)刪除一行數據 DataFrame.drop()

  1. df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['col1','col2','col3'])
  2. # 如果不設置參數inplace=True,則只能在生成的新數據塊中實現刪除效果,而不能刪除原有數據塊的相應行。
  3. df2 = df.drop([0,1])
  4. print (df)
  5. print (df2)
  6. col1 col2 col3
  7. 0 1 2 3
  8. 1 4 5 6
  9. 2 7 8 9
  10. col1 col2 col3
  11. 2 7 8 9
  12. # 如果inplace=True則原有數據塊的相應行被刪除
  13. df.drop([0,1], inplace=True)
  14. print (df)
  15. col1 col2 col3
  16. 2 7 8 9

5、查詢DataFrame數據

(1)根據列名和行索引獲取指定列和行

  1. df.head(n)     # 獲取df中的前n行數據,n不指定,則默認爲5
  2. df.tail(n)     # 獲取df中的後n行數據,n不指定,則默認爲5
  3. # head 和 tail 返回的是一個新的dataframe,與原來的無關
  4. df['a']    # 按照列名獲取指定的列,返回的是一個Series
  5. df[:2]    # 獲取前2行數據,效果等同df[0:2],返回的是一個新的dataframe
  6. df[2:5# 獲取第3行~5行 這3條記錄,返回的是一個新的dataframe
  7. df.loc['20'# 獲取指定索引的行,返回的是一個Series,loc[]傳入的是索引名
  8. df.iloc[3]    # 獲取指定序號的行,這裏是第4行,iloc[]傳入的是行數
  9. df
  10. col1 col2 col3
  11. a 1 2 3
  12. b 4 5 6
  13. c 7 8 9
  14. # 獲取指定行
  15. print (df.loc['a'])
  16. print (df.iloc[0])
  17. col1 1
  18. col2 2
  19. col3 3
  20. Name: a, dtype: int64
  21. col1 1
  22. col2 2
  23. col3 3
  24. Name: a, dtype: int64
  25. # 獲取指定列
  26. print (df['col1'])
  27. a 1
  28. b 4
  29. c 7
  30. Name: col1, dtype: int64
  31. # 獲取單個元素
  32. print (df.iloc[0,1])
  33. 2

(2)條件查詢 

  1. df
  2. col1 col2 col3
  3. a 1 2 3
  4. b 4 5 6
  5. c 7 8 9
  6. df2 = df.loc[(df['col1']>2)&(df['col2']<7)]
  7. print (df2)
  8. col1 col2 col3
  9. b 4 5 6
  10. df3 = df[(df['col1']>1) & (df.col2<8)]
  11. print (df3)
  12. col1 col2 col3
  13. b 4 5 6

6、修改DataFrame數據

(1)遍歷數據

  1. df
  2. col1 col2 col3
  3. a 1 2 3
  4. b 4 5 6
  5. c 7 8 9
  6. for index,row in df.iterrows():
  7. print (index,row[0],row[1],row[2])
  8. a 1 2 3
  9. b 4 5 6
  10. c 7 8 9
  11. # 或者
  12. for co1,col2,col3 in df.values:
  13. print (co1,col2,col3)
  14. 1 2 3
  15. 4 5 6
  16. 7 8 9
  17. # 或者
  18. shape = df.shape
  19. for i in range(shape[0]):
  20. for j in range(shape[1]):
  21. df.iloc[i,j] = 'hehe'
  22. print (df)
  23. col1 col2 col3
  24. a hehe hehe hehe
  25. b hehe hehe hehe
  26. c hehe hehe hehe

(2)修改行和修改列 

  1. df['column'] = [] # column在DataFrame中存在,則修改,否則添加新列
  2. df.iloc[index]、df.loc[index_name] = [] # index在DataFrame中存在則修改,不存在則添加

(3)替換值DataFrame.replace()

  函數原型:

  1. DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
  2.   # to_replace: DataFrame中被替換的元素名
  3.   # value:用於替換DataFrame中和to_replace匹配的值
  4.   # inplace:如果爲true,那麼將修改該對象不產生副本

  實例:  

  1. df
  2. col2 col1 col3
  3. b 4 6 5
  4. a 1 3 2
  5. c 7 9 8
  6. df.replace(9,'hiudown',inplace=True)
  7. print (df)
  8. col2 col1 col3
  9. b 4 6 5
  10. a 1 3 2
  11. c 7 hiudown 8

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章