将多个csv文件读入Pandas数据框架中

5
我正在尝试将多个CSV文件读入Pandas数据帧中。这些CSV文件不是逗号分隔的,而是用分号";"分隔字段。
我基于此处的答案编写了代码。
我的数据都在一个特定的子目录中:/data/luftdaten/5331 这是我运行的命令:
import glob
import pandas as pd

path =r'data/luftdaten/5331' # use your path

filenames = glob.glob(path + "/*.csv")
count_files = 0
dfs = []
for filename in filenames:
    if count_files ==0:
        dfs.append(pd.read_csv(filename, sep=";")) 
        count_files += 1
    else:
        dfs.append(pd.read_csv(filename, sep=";", skiprows=[0]))
        count_files +=1

big_frame = pd.concat(dfs, ignore_index=True)

我使用count_files来监控是否是第一个CSV文件 - 如果是,则导入标题。否则,跳过标题。
代码执行正常。
如果我在该目录中只运行一个文件,一切都没问题:
big_frame.info()

输出:

RangeIndex: 146 entries, 0 to 145
Data columns (**总共12列**):
sensor_id      146 non-null int64
sensor_type    146 non-null object
etc......

如果我在目录中运行它时使用2个或多个文件,一切都会从一开始就出错。

4个文件的输出:

RangeIndex: 1893 entries, 0 to 1892
Data columns (**总共33列**):
-2.077                 1164 non-null float64
-2.130                 145 non-null float64
2.40                   145 non-null float64

在单个CSV版本上运行big_frame.head()会得到以下结果,其中包含正确的列名:

output from importing single CSV

当我使用导入了四个文件的相同代码时,会出现以下情况:

output from importing 4 CSV files (cropped right)

我是否有做什么明显的事情导致行数和列数都在增加?

非常感谢您的指导!


1
无需跳过标题,因为连接不会添加多个标题。 - Parfait
1个回答

9
当前无法正常工作的原因是,当您对第一个文件之后的每个文件执行skiprows=[0]时,新的DataFrame使用其第二行(索引1)作为列标题。因此,在连接框架时,有大量列标题不匹配。如果您删除skiprows=[0],它应该可以正常工作。假设所有文件都具有相同的标头(或者当它们不同时您可以接受NaN),您应该能够在一行中完成此操作。
big_frame = pd.concat([pd.read_csv(f, sep=';') for f in glob.glob(path + "/*.csv")],
                      ignore_index=True)

谢谢@asongtoruin,这个完美地解决了问题,而且比我的代码更加优雅! - Watty62

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接