通过 Pandas 连接(许多)CSV 文件
Posted
技术标签:
【中文标题】通过 Pandas 连接(许多)CSV 文件【英文标题】:Concatenating (many) CSV files via Pandas 【发布时间】:2018-05-03 03:31:45 【问题描述】:我基本上是在尝试在 Pandas 中连接许多时间序列类型的 csv 文件,我确信我知道该怎么做,但显然我不知道。
考虑这个简单的例子:
我们有三个 csv 文件:
file1.csv=
Alfa, A1, A2, A3, A4
Beta, B1, B2, B3, B4
Gamma, C1, C2, C3, C4
file2.csv=
Delta, D1, D2, D3, D4
Epsilon, E1, E2, E3, E4
Zeta, F1, F2, F3, F4
file3.csv=
Eta, G1, G2, G3, G4
Theta, H1, H2, H3, H4
Iota, I1, I2, I3, I4
第一个玩具代码:
[In]:
import pandas as pd
a = pd.read_csv("/Test/file1.csv", header=None)
b = pd.read_csv("/Test/file2.csv", header=None)
c = pd.read_csv("/Test/file3.csv", header=None)
colnames = ["GREEK", "ROW1", "ROW2", "ROW3", "ROW4"]
concatDf = pd.concat([a,b,c], axis=0)
concatDf.columns = colnames
print(concatDf)
[Out]:
GREEK ROW1 ROW2 ROW3 ROW4
0 Alfa A1 A2 A3 A4
1 Beta B1 B2 B3 B4
2 Gamma C1 C2 C3 C4
0 Delta D1 D2 D3 D4
1 Epsilon E1 E2 E3 E4
2 Zeta F1 F2 F3 F4
0 Eta G1 G2 G3 G4
1 Theta H1 H2 H3 H4
2 Iota I1 I2 I3 I4
不漂亮,但做了它应该做的事情。 由于真正的 CSV 文件的名称很长并且文件数量很多,我想我应该让事情变得更容易一些。因此第二个玩具代码:
[In]:
import glob
import pandas as pd
allFiles = glob.glob("/Test/" + "*.csv")
dfList = []
for filename in allaFiler:
df = pd.read_csv(filename)
dfList.append(df)
concatDf = pd.concat(dfList, axis=0)
print(concatDf)
[Out]:
A1 A2 A3 A4 D1 D2 D3 D4 G1 G2 G3 G4 Alfa Delta Eta
0 B1 B2 B3 B4 NaN NaN NaN NaN NaN NaN NaN NaN Beta NaN NaN
1 C1 C2 C3 C4 NaN NaN NaN NaN NaN NaN NaN NaN Gamma NaN NaN
0 NaN NaN NaN NaN E1 E2 E3 E4 NaN NaN NaN NaN NaN Epsilon NaN
1 NaN NaN NaN NaN F1 F2 F3 F4 NaN NaN NaN NaN NaN Zeta NaN
0 NaN NaN NaN NaN NaN NaN NaN NaN H1 H2 H3 H4 NaN NaN Theta
1 NaN NaN NaN NaN NaN NaN NaN NaN I1 I2 I3 I4 NaN NaN Iota
file1.csv、file2.csv 和 file3.csv 是测试图中的唯一文件。 我查了documentation,但没有找到解释。
我的问题如下:
-
为什么代码 2 产生的结果与代码 1 不同?我显然遗漏了一些非常基本的东西,所以请帮助我了解发生了什么。
我必须做哪些更改才能使代码 2 产生与代码 1 相同的结果?
提前致谢!
【问题讨论】:
基本问题是您的每个 CSV 都有不同的行名称,因此在连接期间索引不会对齐。最快的解决方法是在附加到dfList
之前重命名数据框列 (list('ABCD')
)。
所以基本上我所要做的就是以统一的方式命名行?
是的,我已经写了一个答案,告诉你怎么做。
【参考方案1】:
您的所有数据框似乎都有不同的名称。这会导致pd.concat
在连接期间未对齐数据帧。
解决方案是在串联之前一致地命名每一个。读取数据框时使用names
参数指定列名。
dfList = []
for filename in allaFiler:
df = pd.read_csv(filename, header=None, names=list('ABCD'))
dfList.append(df)
【讨论】:
非常感谢!像魅力一样工作! 我认为 skiprows=0 否则不会包含 alpha 行。 @userjuicer 我根据您的问题中所写的内容推断出这一点。如果您认为需要进行任何更改,请随时编辑我的帖子,我会接受您的编辑。 再次感谢,你不知道你为我节省了多少时间! @userjuicer 没问题。实际上,如果 skiprows=0,您可以完全省略该参数。编码愉快。以上是关于通过 Pandas 连接(许多)CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:连接多个 .csv 文件并返回聚合了同名列的 Dataframe
如何使用 Python Pandas 合并多个 CSV 文件