在熊猫中将文件名附加到csv文件

时间:2020-07-21 09:39:25

标签: python python-3.x

我正在尝试将CS​​V文件的文件名作为列名称附加到那些CSV文件中,并且我具有基本的操作思路和代码,只是无法将其集成到当前代码中。这可能很容易。

这就是我读取CSV文件并将其附加到数据框中的方式

big_frame = pd.concat([pd.read_csv(f, skiprows=0 , header=None , index_col= False ,names=col_Names) for f in glob.glob('filepath' + "/*.csv")],
                      ignore_index=True)

我知道我只需要在代码的某处添加这两行

frame['filename'] = os.path.basename(f)
f.append(frame)

有什么帮助吗?

例如,我有3个CSV文件,每个文件具有相同的列名,如下所示。

Column A Column B Column C 

我想将它们全部合并到大数据框中,并在新列中添加原始CSV文件名称,例如

Column A Column B Column C filename
                            file 1
                            file 2
                            file 3

2 个答案:

答案 0 :(得分:1)

您可以使用df.assign,也可以使用Path.glob模块中的pathlib打开文件。

from pathlib import Path

big_frame = pd.concat(
    [pd.read_csv(file.name, skiprows=0, header=None, index_col=False, names=col_Names).assign(filname=file.name)
     for file in Path('filepath').glob('*.csv')],
    ignore_index=True)

答案 1 :(得分:0)

在读取read_csv之后使用DataFrame.assign()来添加一列:

big_frame = pd.concat([pd.read_csv(f, ...).assign(filename=os.path.basename(f))
                       for f in glob.glob('filepath' + "/*.csv")],
                      ignore_index=True)

({...指向read_csv的所有其他参数。)

其他更改:

  1. pd.concat()接受生成器,因此您无需使用列表理解即可创建df的列表。它只使用了比需要的更多的内存,并且由于您正在读取磁盘,因此无法提高性能。并且当您使用生成器表达式时,它将需要额外的括号。注意可读性的额外缩进:

    big_frame = pd.concat((pd.read_csv(f, ...).assign(filename=os.path.basename(f))
                               for f in glob.glob('filepath' + "/*.csv")),
                           ignore_index=True)
    
  2. 对于globo,请使用os.path.join(因为filepath是变量名,而不是实际路径:

    glob.glob(os.path.join(filepath, '*.csv'))
    

    或者使用pathlib.PathPath.glob作为死角的答案。

具有所有参数:

big_frame = pd.concat((pd.read_csv(f,
                                   skiprows=0,
                                   header=None,
                                   index_col=False,
                                   names=col_Names,
                        ).assign(filename=os.path.basename(f))
                            for f in glob.glob(os.path.join(filepath, '*.csv'))
                       ),
                       ignore_index=True)

顺便说一句,我在批量读取CSV时执行此操作,除了我不只使用基名,因为我想要包含文件的完整路径。从不同的源/目录读取相同格式的CSV时特别有用。