我目前在一個專案中,我需要處理很多 CSV 檔案,這些檔案充滿了如下資料:
CSV1.csv
A B C D ...
1 1980 1 0.9 0.8
2 2003 0.9 0.8 0.2
3 1665 0.7 0.2 0.4
4 1982 0.6 1 0.2
...
CSV2.csv
A E F G ...
1 1665 1 0.4 1
2 1980 0.4 0.8 0.6
3 2003 0.1 0.3 0.9
4 1982 0.3 1 0.6
...
所有 CSV 檔案在A列中都具有相同的值,但雜亂無章。我正在匯入這樣的所有檔案:
path = r"/Users/.../folder/"
all_files = glob.glob(path "/*.CSV")
all_csv = (pd.read_csv(f, sep=',') for f in all_files)
df_merged = pd.concat(all_csv, axis=1, ignore_index=False)
它被合并了,但資料框是雜亂無章的。
這種排序方式不正確,df_merged.sort()因為在 處沒有具有相同順序的列A。我知道我可以手動匯入每個 csv 檔案并應用一個.sort(),但那些是 394 個 csv 檔案...
我覺得像什么這樣可能適用大型進口的CSV檔案,但我不知道如何呼叫代碼行之前的資料幀組合被制成(all_csv是一個生成器物件)。
PS最后我執行以消除重復的A列:
df_merged = df_merged.loc[:, ~df_merged.columns.duplicated()]
uj5u.com熱心網友回復:
您應該將每個資料幀合并在一起,而不是使用 concat:
df = all_csv[0]
for csv in all_csv[1:]:
df = df.merge(csv)
輸出:
>>> df
A B C D E F G
0 1980 1.0 0.9 0.8 0.4 0.8 0.6
1 2003 0.9 0.8 0.2 0.1 0.3 0.9
2 1665 0.7 0.2 0.4 1.0 0.4 1.0
3 1982 0.6 1.0 0.2 0.3 1.0 0.6
注意:您需要制作all_csv一個串列而不是生成器:
all_csv = [pd.read_csv(f, sep=',') for f in all_files]
uj5u.com熱心網友回復:
可以通過將 A 設定為索引來獲得對齊。
使用資料幀串列并不吸引人,因為這會占用大量記憶體。
- 解決方案 1:在回圈中構建其他資料框
import pandas as pd path = r"/Users/.../folder/" all_files = glob.glob(path "/*.CSV") df = pd.read_csv(all_files[0], sep=',').set_index('A') for f in all_files[1:]: dfs = pd.read_csv(f, sep=',').set_index('A') df = pd.concat([df, dfs], axis=1)- 解決方案2:保留發電機并使用
functools.reduce
import pandas as pd from functools import reduce path = r"/Users/.../folder/" all_files = glob.glob(path "/*.CSV") def_gen = (pd.read_csv(io.StringIO(fn), sep='\s ').set_index('A') for fn in all_files) df = reduce(lambda df, d: pd.concat([df, d], axis=1), def_gen)df:B C D E F G A 1665 0.7 0.2 0.4 1.0 0.4 1.0 1980 1.0 0.9 0.8 0.4 0.8 0.6 1982 0.6 1.0 0.2 0.3 1.0 0.6 2003 0.9 0.8 0.2 0.1 0.3 0.9
就我個人而言,我會采用簡單的路徑(“解決方案 1”)并添加一些日志記錄來確定將出現匯入錯誤的位置。因為在現實世界中,資料很少是干凈且格式良好的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379974.html
