
-- 不怕前路坎坷,只怕從一開始就走錯了方向
Pandas 是python的一個數據分析包,納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。Pandas 就是為解決數據分析任務生的,無論是數據分析還是機器學習項目數據預處理中, Pandas 無處不在。
最近掉進一坑,差點鑄成大錯。實在沒想到居然栽在pandas.read_csv上了,這里分享一下,希望大家注意。
另:業務數據不方便拿出來演示,為盡可能復現,這里我手造了一份,另存為 income.csv 文件。

翻船記
讀取csv文件小菜一碟
import numpy as np
import pandas as pd
df = pd.read_csv(r'C:...income.csv',encoding='utf-8')
讀好了看看數據信息吧:
df.info()RangeIndex: 6 entries, 0 to 5
Data columns (total 1 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 income 6 non-null object
dtypes: object(1)
memory usage: 176.0+ bytes
誒,怎么數據成了object?不應該是float嗎?
不管他,硬轉一發
df=pd.DataFrame(df,dtype=np.float)
居然報錯了,1000被讀成了字符串。

其實這里我還掉進了另一個坑,使用了一個已被棄用的 .convert_objects 方法。這種方法更硬,直接把string轉成了NaN,所以后面各種操作流暢且錯誤地進行著....這都是 pandas 沒升級的鍋,定期檢查升級包太有必要了(pip 的高階玩法)
說回剛才的問題,1,000被讀成了字符串是因為csv文件中它使用了千位分隔符。問題其實非常簡單,設置一下 thousands 參數就行了
df2 = pd.read_csv(r'C:...income.csv',encoding='utf-8',thousands =',')
看一下info
df2.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 1 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 income 6 non-null float64
dtypes: float64(1)
往下繼續
df2.describe()income
count 6.000000
mean 16934.983333
std 40695.203980
min 0.000000
25% 32.425000
50% 300.000000
75% 875.000000
max 100000.000000
一切正常!
pandas.read_csv()參數

pandas.read_csv()的參數特別多,除了filepath,其他均可缺省。參數的具體含義這里就不贅述,還想復習一下的同學可以直接去看官方文檔
http://pandas.pydata.org/pandas-docs/stable/io.html
英語不好的同學可以看一下熱心博主的翻譯版: https://www.cnblogs.com/datablog/p/6127000.html