Pandas讀取CSV文件主要用到的函數爲:pandas.read_csv()
- 函數原型:
- pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer',
- names=None, index_col=None, usecols=None, squeeze=False,
- prefix=None, mangle_dupe_cols=True, dtype=None, engine=None,
- converters=None, true_values=None, false_values=None,
- skipinitialspace=False, skiprows=None, nrows=None,
- na_values=None, keep_default_na=True, na_filter=True,
- verbose=False, skip_blank_lines=True, parse_dates=False,
- infer_datetime_format=False, keep_date_col=False, date_parser=None,
- dayfirst=False, iterator=False, chunksize=None, compression='infer',
- thousands=None, decimal=b'.', lineterminator=None, quotechar='"',
- quoting=0, escapechar=None, comment=None, encoding=None,
- dialect=None, tupleize_cols=None, error_bad_lines=True,
- warn_bad_lines=True, skipfooter=0, doublequote=True,
- delim_whitespace=False, low_memory=True, memory_map=False,
- float_precision=None)
-
- 常用參數:
- filepath_or_buffer : 類型str,代表CSV文件地址。
- sep : 類型str, 默認值爲‘,’,用於指定分隔符。如果不指定參數,則會嘗試使用逗號分隔。
- header : 類型爲int或者int的列表,它指定用來作爲列名行號,然後數據從行號的下一行開始讀取。 默認情況下header是根據參數names(如下)
- 來推斷header的值。如果names爲None,則等價於header=0,默認把文件中第一行作爲列名,數據從第一行開始讀取。如果names顯示地傳入,
- 則等價於header=None,則數據從0行開始讀取。如果傳入header=0,names不爲None,則將替換原有的列名。header參數可以是一個list。
- 例如:[0,1,3],這個list表示將文件中的這些行作爲列標題(意味着每一列有多個標題),介於中間的行將被忽略掉(例如本例中的2;
- 本例中的數據1,2,4行將被作爲多級標題出現,第3行數據將被丟棄,dataframe的數據從第5行開始。)。
- names : 一個數組, 默認爲None。列名列表,如果數據文件中沒有列標題行,就需要執行header=None。
- usecols : 一個數組, 默認爲None,返回數據列一個子集。如果傳入字符,則列名需要與表中列名對應。如果傳入整數列表,則表示列的索引值。
- 例如:usecols有效參數可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。
- prefix : 類型str, 默認爲None。在沒有列標題時,給列添加前綴。例如:添加‘X’ 成爲 X0, X1, ...
- engine : {‘c’, ‘python’},可選。使用的分析引擎。可以選擇C或者是python。C引擎快但是Python引擎功能更加完備。
- nrows : 類型int, 默認爲None。需要讀取的行數(從文件頭開始算起)。
- iterator : 類型boolean, 默認爲False。返回一個TextFileReader 對象,以便逐塊處理文件。
如果CSV文件過大,則可以分塊讀取CSV文件,比如:
- import pandas as pd
-
- reader = pd.read_csv('./train.csv', iterator=True)
- try:
- df = reader.get_chunk(70000) # 讀取70000行數據
- except StopIteration:
- print ("Iteration is stopped.")
- print (df.info())
2、DataFrame保存到CSV
將DataFrame保存到CSV文件的函數爲:DataFrame.to_csv()
- 函數原型:
- DataFrame.to_csv(path_or_buf=None, sep=', ', na_rep='', float_format=None, columns=None,
- header=True, index=True, index_label=None, mode='w', encoding=None,
- compression=None, quoting=None, quotechar='"', line_terminator='\n',
- chunksize=None, tupleize_cols=None, date_format=None, doublequote=True,
- escapechar=None, decimal='.')
- 常用參數:
- path_or_buf : 文件路徑,如果沒有指定則將會直接返回字符串的 json
- sep : 輸出文件的字段分隔符,默認爲 “,”
- na_rep : 用於替換空數據的字符串,默認爲''
- float_format : 設置浮點數的格式(幾位小數點)
- columns : 要寫的列
- header : 是否保存列名,默認爲 True ,保存
- index : 是否保存索引,默認爲 True ,保存
3、增加DataFrame數據
(1)增加一列數據
- print df2
- col1 col2 col3
- a 1 2 3
- b 4 5 6
-
- df2['col4'] = ['cnn','rnn'] # 對DataFrame對象進行列擴充
- print df2
- col1 col2 col3 col4
- a 1 2 3 cnn
- b 4 5 6 rnn
-
- df2['col5'] = pd.DataFrame(['MachineLearning','DeepLearning'],index=['a','b'])
- print df2 # 也可以通過一個新的DataFrame對象來定義一個新列,索引自動對應
- col1 col2 col3 col4 col5
- a 1 2 3 cnn MachineLearning
- b 4 5 6 rnn DeepLearning
-
- df2['col4'] = 1
- print df2
- col1 col2 col3 col4
- a 1 2 3 1
- b 4 5 6 1
(2)增加一行數據
- df
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
-
- new_line = [7,8,9]
- df.loc[3]= new_line
- print (df)
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
- 3 7 8 9
但是十分注意的是,這樣實際是改的操作,如果 df.loc [index] 中的index已經存在,則新的值會覆蓋之前的值。可以使用DataFrame.append()方法添加。例如:
- df1 = pd.DataFrame([[1,2,3],[4,5,6]],columns=['col1','col2','col3'])
- df2 = pd.DataFrame([[7,8,9],[10,11,12]],columns=['col1','col2','col3'])
- print (df1)
- print (df2)
-
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
- col1 col2 col3
- 0 7 8 9
- 1 10 11 12
-
- df3 = df1.append(df2, ignore_index=True)
- df4 = df1.append(df2)
- print (df3)
- print (df4)
-
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
- 2 7 8 9
- 3 10 11 12
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
- 0 7 8 9
- 1 10 11 12
4、刪除DataFrame數據
(1)刪除一列數據del 、DataFrame.drop()
- del df['a'] #刪除dataframe中指定的列,這個是直接影響當前的dataframe,注意 del不是函數,是python中的內置語句,沒有返回值.
-
- df.drop(['a'],axis=1) #刪除指定的列,與上面的區別是不會影響原來的dataframe,drop方法會返回一個刪除了指定列的新的dataframe.
-
- # 這裏如果不加axis=1,則默認是刪除行,比如
- df
- col1 col2 col3
- a 1 2 3
- b 4 5 6
- c 7 8 9
-
- df.drop(['a'], inplace=True)
- print (df)
- col1 col2 col3
- b 4 5 6
- c 7 8 9
(2)刪除一行數據 DataFrame.drop()
- df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['col1','col2','col3'])
-
- # 如果不設置參數inplace=True,則只能在生成的新數據塊中實現刪除效果,而不能刪除原有數據塊的相應行。
- df2 = df.drop([0,1])
- print (df)
- print (df2)
-
- col1 col2 col3
- 0 1 2 3
- 1 4 5 6
- 2 7 8 9
- col1 col2 col3
- 2 7 8 9
-
- # 如果inplace=True則原有數據塊的相應行被刪除
- df.drop([0,1], inplace=True)
- print (df)
-
- col1 col2 col3
- 2 7 8 9
5、查詢DataFrame數據
(1)根據列名和行索引獲取指定列和行
- df.head(n) # 獲取df中的前n行數據,n不指定,則默認爲5
- df.tail(n) # 獲取df中的後n行數據,n不指定,則默認爲5
- # head 和 tail 返回的是一個新的dataframe,與原來的無關
-
- df['a'] # 按照列名獲取指定的列,返回的是一個Series
- df[:2] # 獲取前2行數據,效果等同df[0:2],返回的是一個新的dataframe
- df[2:5] # 獲取第3行~5行 這3條記錄,返回的是一個新的dataframe
- df.loc['20'] # 獲取指定索引的行,返回的是一個Series,loc[]傳入的是索引名
- df.iloc[3] # 獲取指定序號的行,這裏是第4行,iloc[]傳入的是行數
-
- df
- col1 col2 col3
- a 1 2 3
- b 4 5 6
- c 7 8 9
-
- # 獲取指定行
- print (df.loc['a'])
- print (df.iloc[0])
- col1 1
- col2 2
- col3 3
- Name: a, dtype: int64
- col1 1
- col2 2
- col3 3
- Name: a, dtype: int64
-
- # 獲取指定列
- print (df['col1'])
- a 1
- b 4
- c 7
- Name: col1, dtype: int64
-
- # 獲取單個元素
- print (df.iloc[0,1])
- 2
(2)條件查詢
- df
- col1 col2 col3
- a 1 2 3
- b 4 5 6
- c 7 8 9
-
- df2 = df.loc[(df['col1']>2)&(df['col2']<7)]
- print (df2)
- col1 col2 col3
- b 4 5 6
-
- df3 = df[(df['col1']>1) & (df.col2<8)]
- print (df3)
- col1 col2 col3
- b 4 5 6
6、修改DataFrame數據
(1)遍歷數據
- df
- col1 col2 col3
- a 1 2 3
- b 4 5 6
- c 7 8 9
-
- for index,row in df.iterrows():
- print (index,row[0],row[1],row[2])
- a 1 2 3
- b 4 5 6
- c 7 8 9
-
- # 或者
- for co1,col2,col3 in df.values:
- print (co1,col2,col3)
- 1 2 3
- 4 5 6
- 7 8 9
-
- # 或者
- shape = df.shape
- for i in range(shape[0]):
- for j in range(shape[1]):
- df.iloc[i,j] = 'hehe'
- print (df)
- col1 col2 col3
- a hehe hehe hehe
- b hehe hehe hehe
- c hehe hehe hehe
(2)修改行和修改列
- df['column'] = [] # column在DataFrame中存在,則修改,否則添加新列
- df.iloc[index]、df.loc[index_name] = [] # index在DataFrame中存在則修改,不存在則添加
(3)替換值DataFrame.replace()
函數原型:
- DataFrame.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad', axis=None)
- # to_replace: DataFrame中被替換的元素名
- # value:用於替換DataFrame中和to_replace匹配的值
- # inplace:如果爲true,那麼將修改該對象不產生副本
實例:
- df
- col2 col1 col3
- b 4 6 5
- a 1 3 2
- c 7 9 8
-
- df.replace(9,'hiudown',inplace=True)
- print (df)
- col2 col1 col3
- b 4 6 5
- a 1 3 2
- c 7 hiudown 8