Python合并熊猫数据框

时间:2020-10-12 17:52:33

标签: python pandas dataframe csv

我是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文件?不幸的是,我没有循环经验。

感谢您的帮助。

2 个答案:

答案 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.csvdf2d.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.concatdf.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)