Python合併多個csv檔案

dta0502發表於2018-08-24

匯入所需的包

import os
import pandas as pd
import glob

合併多個csv檔案

csv_list = glob.glob('*.csv') #檢視同資料夾下的csv檔案數
print(u'共發現%s個CSV檔案'% len(csv_list))
print(u'正在處理............')
for i in csv_list: #迴圈讀取同資料夾下的csv檔案
    fr = open(i,'rb').read()
    with open('result.csv','ab') as f: #將結果儲存為result.csv
        f.write(fr)
print(u'合併完畢!')
共發現9個CSV檔案
正在處理............
合併完畢!

去重函式

這個函式將重複的內容去掉,主要是去表頭。

df = pd.read_csv("result.csv",header=0)
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 659867 entries, 0 to 659866
Data columns (total 3 columns):
UrbanRuralCode    659867 non-null object
code              659867 non-null object
name              659867 non-null object
dtypes: object(3)
memory usage: 15.1+ MB
IsDuplicated = df.duplicated()
True in IsDuplicated
True

這說明了這個DataFrame格式的資料含有重複項。

DataFrame.drop_duplicates函式的使用

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)
  • subset : column label or sequence of labels, optional
    用來指定特定的列,預設所有列
  • keep : {‘first’, ‘last’, False}, default ‘first’
    刪除重複項並保留第一次出現的項
  • inplace : boolean, default False
    是直接在原來資料上修改還是保留一個副本
datalist = df.drop_duplicates(keep = False)
datalist.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 659859 entries, 0 to 659866
Data columns (total 3 columns):
UrbanRuralCode    659859 non-null object
code              659859 non-null object
name              659859 non-null object
dtypes: object(3)
memory usage: 20.1+ MB

排序函式

datalist_sorted = datalist.sort_values(by = ['code']) #按1列進行升序排序

結果寫入csv檔案

datalist_sorted.to_csv("village_all.csv", sep = ',', header = True,index = False)

問題

Python讀取檔案問題

錯誤資訊

"UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence"  

解決方案

fr = open(i,'r').read() 改為 fr = open(i,'rb').read()
with open('result.csv','a') as f: 改為 with open('result.csv','ab') as f:

重複值問題

這裡我合併了9個csv檔案,檢查最後合併結果發現,裡面還有一個列名。這是因為9個為檔案,其中8個的列名被認為是DataFrame的值,第1個的列名依舊為列名,然後再去重的過程中,8個相同值被保留了1個,所以這會導致最後的csv檔案多了一個列名

解決方案

IsDuplicated = df.duplicated() 改為 IsDuplicated = df.duplicated(keep = False) #重複資料全部去除

相關文章