今天在工作的時候, 碰到兩個表需要做連線, 很簡單的問題,pd.merge
就可以解決問題. 但是在檢查資料的時候卻發現很多沒有merge上, 明明要連線的字段在兩個表中都有記錄, 為什麼merge出來的結果有缺失呢?仔細檢查資料才發現, 有些資料字段是以0開頭的, 例如0021
等. python在讀取這些資料的時候會忽略掉最前面的多個0, 所以會出現上述情況?
這個問題該怎麼處理? 其實很簡單,code
最容易直觀說明與解決問題了.
data1 = pd.dataframe()
data1
out[1]:
idname
0001
1002
2031
3421
data1.dtypes
out[2]:
id object
name object
dtype: object
data2 = pd.dataframe()
data2
out[3]:
idlabel
0001
1002
2031
merge_data1 = pd.merge(data1, data2, on='id',how='left')
merge_data1
out[4]:
idname
label
0001
alice
1002
bruce
2031
cook
3421
daisy
這個輸出沒有什麼問題, 和預想的結果保持一致;
接著, 我們建立兩個臨時資料data1
和data2
, 然後我們另存, 改為從本地讀取檔案, 看看是什麼效果.
temp1 = pd.read_csv('./data/test1019/data1.txt')
temp1
out[5]:
idname01
12231
3421
temp2 = pd.read_csv('./data/test1019/data2.txt',dtype=)
temp2
out[6]:
idlabel
0001
1002
2031
merge_data2 = pd.merge(temp1, temp2, on='id',how='left')
merge_data2
out[7]:
idname
label01
alice12
bruce231
cook
3421
daisy
比較理想的結果是: python將兩個檔案中所有以0
打頭的字段都忽略掉, 這樣標準一樣, merge的結果還是一致的.
不理想的結果, 就如merge_data2
的結果,python
將temp1
的id
欄位中的0忽略掉, 但是temp2
的id
欄位中的0還是正常顯示, 這樣就會造成結果輸出與預想的不一致, 導致後續所有的結果都是錯的.
那麼問題來了, 像這種小量的資料, 我們能直接觀察到資料讀寫的問題, 如今大資料時代, 我們該如何規避此類問題呢? 在上面的**中, 已經給出了一種解決方案.
#方案1: 使用lambda函式
te*** = pd.read_csv('./data/test1019/data1.txt',converters=)
te***
out[8]:
idname
0001
1002
2031
3421
#方案2: 使用dtype對特定列進行制定資料型別
temp4 = pd.read_csv('./data/test1019/data2.txt',dtype=)
temp4
out[9]:
idlabel
0001
1002
2031
merge_data3 = pd.merge(te***, temp4, on='id',how='left')
merge_data3
因此, 為了保證資料原有的格式, 對一些會被各種程式語言特殊處理掉的資料, 一定要先宣告資料型別. Python 資料處理
將檔案切分,存入列表 strip split with open james.txt as jaf data jaf.readline james data.strip split 資料檔案為 2 34,3 21,2.34,2.45,3.01,2 01,2 01,3 10,2 22 print ja...
Python 資料處理
本場 chat 為 python 資料處理課程,包括 python 基礎知識 極簡教程 提公升 python 執行效率的方法 爬蟲簡介 scrapy selenium 自動化測試框架 簡易分布式 redis 分詞程式設計 jieba 資料儲存 本地資料上傳 hive 通過本場 chat 讀者可學到以...
Python資料處理
用傳統的電子 來處理資料不僅效率低下,而且無法處理某些格式的資料,對於混亂或龐大的資料集更是束手無策。本書將教你如何利用語法簡單 容易上手的python輕鬆處理資料。作者通過循序漸進的練習,詳細介紹如何有效地獲取 清洗 分析與呈現資料,如何將資料處理過程自動化,如何安排檔案編輯與清洗任務,如何處理更...