我是Python的新手,正在寻找一个简单的解决方案。
我在一个文件夹中有几个结构相同(列数和行数)的.csv文件。 路径是:C:\ temp
现在,我想将所有这些.csv文件读取到一个新的数据框中,然后稍后再导出为新的.csv文件。
到目前为止,我已经手动读取了每个.csv文件并将其保存到熊猫数据框中。
这里是一个例子:
df1 = pd.read_csv(r "C:\temp\df1.csv", header= None)
df2 = pd.read_csv(r "C:\temp\df2.csv", header= None)
df1
0 id Feature
1 1 12
2 2 13
3 3 14
4 4 15
5 5 16
6 7 17
7 8 15
8 9 12
9 10 13
10 11 23
然后我使用.append合并数据框。
df_new = df1.append(df2)
0 id Feature
1 1 12
2 2 13
3 3 14
4 4 15
5 5 16
6 7 17
7 8 15
8 9 12
9 10 13
10 11 23
0 id Feature
1 1 14
2 2 9
3 3 3
4 4 8
5 5 9
6 7 1
7 8 32
8 9 7
9 10 3
10 11 12
df_new.to_csv('df_new.csv', index=False)
不幸的是,此版本始终带有标头,但我不需要它。所以我之后手动将其删除。
没有更快的版本吗?我正在考虑一个for循环,该循环会打开路径中所有现有的.csv文件,并将它们逐行读取到新的数据帧中,并在循环结束时从中生成一个.csv文件?不幸的是,我没有循环经验。
感谢您的帮助。
答案 0 :(得分:1)
您可以执行以下操作:
frames = []
for i in range(0,10):
frames.append(pd.read_csv(r "C:\temp\df%d.csv" % i))
df = pd.concat(frames)
这应该将所有csv文件连接到一个数据帧中,并且如果所有文件名的结构都像df1d.csv
,df2d.csv
等,并且您知道文件的数量,则可以使用。如果只想遍历文件夹中的所有文件,则可以执行以下操作:
import glob
path = "C:\temp\*.csv"
frames = []
for fname in glob.glob(path):
frames.append(pd.read_csv(fname))
df = pd.concat(frames)
没有循环的扩展版本将是:
df1 = pd.read_csv(r "C:\temp\df1.csv")
df2 = pd.read_csv(r "C:\temp\df2.csv")
df3 = pd.read_csv(r "C:\temp\df3.csv")
frames = [df1, df2, df3]
df = pd.concat(frames)
然后,您可以将数据帧保存回csv文件:
df.to_csv(file_name)
答案 1 :(得分:0)
In [1]: import pandas as pd
In [2]: from io import StringIO
In [3]: df = pd.read_csv(StringIO("""0 id Feature
...: 1 1 12
...: 2 2 13
...: 3 3 14
...: 4 4 15
...: 5 5 16
...: 6 7 17
...: 7 8 15
...: 8 9 12
...: 9 10 13
...: 10 11 23"""), sep=' ')
In [4]: df1 = pd.read_csv(StringIO("""0 id Feature
...: 1 1 14
...: 2 2 9
...: 3 3 3
...: 4 4 8
...: 5 5 9
...: 6 7 1
...: 7 8 32
...: 8 9 7
...: 9 10 3
...: 10 11 12"""), sep=' ')
In [10]: pd.concat([df, df1])
Out[10]:
0 id Feature
0 1 1 12
1 2 2 13
2 3 3 14
3 4 4 15
4 5 5 16
5 6 7 17
6 7 8 15
7 8 9 12
8 9 10 13
9 10 11 23
0 1 1 14
1 2 2 9
2 3 3 3
3 4 4 8
4 5 5 9
5 6 7 1
6 7 8 32
7 8 9 7
8 9 10 3
9 10 11 12
In [11]: %timeit pd.concat([df, df1])
188 µs ± 4.86 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [14]: df.append(df1)
Out[14]:
0 id Feature
0 1 1 12
1 2 2 13
2 3 3 14
3 4 4 15
4 5 5 16
5 6 7 17
6 7 8 15
7 8 9 12
8 9 10 13
9 10 11 23
0 1 1 14
1 2 2 9
2 3 3 3
3 4 4 8
4 5 5 9
5 6 7 1
6 7 8 32
7 8 9 7
8 9 10 3
9 10 11 12
In [15]: %timeit df.append(df1)
197 µs ± 4.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
使用熊猫版本“ 1.1.3”
您可以清楚地检查pd.concat
比df.append(df1)
快。
要使用循环,您可以使用文件名创建一个变量,并使用for循环保存这些文件中的数据帧列表,诸如此类
filename = ['1.csv', '2.csv']
dfs = []
for name in filename:
dfs.append(pd.read_csv(name))
new_df = pd.concat(dfs)
这也很容易,高效,清洁和快速。
然后将文件保存到csv。
new_df.to_csv(out_filename)