日常分析數據時,只有單一數據文件的情況其實很少見,更多的情況是,我們從同一個數據來源定期或不定期的採集了很多數據文件;或者從不同的數據源採集多種不同格式的數據文件。 在這樣的情況下,分析數據之前,需要將不同的數據集合併起來。合併數據一般有兩個維度,一是同構的數據集合併後行數增加;一是異構的數據集合併 ...
日常分析數據時,只有單一數據文件的情況其實很少見,更多的情況是,
我們從同一個數據來源定期或不定期的採集了很多數據文件;或者從不同的數據源採集多種不同格式的數據文件。
在這樣的情況下,分析數據之前,需要將不同的數據集合併起來。
合併數據一般有兩個維度,一是同構的數據集合併後行數增加;一是異構的數據集合併後列數增加。
1. 同構數據集
比如我們採集了3個不同年份的人口統計文件,分別為:
import pandas as pd
fp1 = "population1.csv"
df = pd.read_csv(fp1)
df
import pandas as pd
fp2 = "population2.csv"
df = pd.read_csv(fp2)
df
import pandas as pd
fp3 = "population3.csv"
df = pd.read_csv(fp3)
df
合併所有的數據集可以用 pd.concat
方法,不過一個一個文件讀取之後再合併比較麻煩。
如果文件名稱有規律的話(一般定期採集的數據集文件,文件名都有一定的規律),可以通過 glob
庫(支持通配符匹配)來匹配所有數據文件。
然後利用python
代碼的靈活性一次合併所有的數據。
from glob import glob
files = sorted(glob("./population[1-3].csv"))
df = pd.concat((pd.read_csv(f) for f in files))
df
這樣合併之後,發現索引是有重覆的,如果要保持索引的唯一性,可以在合併時指定 ignore_index=True
。
df = pd.concat((pd.read_csv(f) for f in files), ignore_index=True)
df
2. 異構數據集
異構的數據集指數據結構不一樣的數據,一般來自於不同的數據源。
比如:
import pandas as pd
fp1 = "population-total.csv"
df = pd.read_csv(fp1)
df
import pandas as pd
fp2 = "population-man.csv"
df = pd.read_csv(fp2)
df
import pandas as pd
fp3 = "population-woman.csv"
df = pd.read_csv(fp3)
df
合併的方式和前面按行合併類似,區別在於指定 axis=1
。
from glob import glob
files = sorted(glob("./population-*.csv"))
df = pd.concat((pd.read_csv(f) for f in files), axis=1)
df
合併之後發現有重覆的列,對於重覆的行,可以簡單的通過 drop_duplicates()
方法來去重,
去除重覆的列則需要一些技巧。
df = df.loc[:, ~df.columns.duplicated()]
df
這樣就去除了重覆的列,完成了異構數據集的合併。
3. 附錄
本篇使用的示例數據可以通過下麵的url下載:
- population1.csv:http://databook.top:8888/pandas-tricks/population1.csv
- population2.csv:http://databook.top:8888/pandas-tricks/population2.csv
- population3.csv:http://databook.top:8888/pandas-tricks/population3.csv
- population-total.csv:http://databook.top:8888/pandas-tricks/population-total.csv
- population-man.csv:http://databook.top:8888/pandas-tricks/population-man.csv
- population-woman.csv:http://databook.top:8888/pandas-tricks/population-woman.csv