在读取csv文件时将一列添加到数据帧[pandas]

时间:2019-04-11 09:48:05

标签: python pandas

我正在读取多个csv文件,并将它们组合为一个数据帧,如下所示:

pd.concat([pd.read_csv(f, encoding='latin-1') for f in glob.glob('*.csv')],
         ignore_index=False, sort=False)

问题:

我想基于要连接到数据框的每个csv文件的csv文件名,在任何csv中(到数据框)添加一个不存在的列。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

glob.glob返回正常的字符串,因此您只需在循环中的每个单独的数据帧中添加一列即可。

假设您的目录中有文件df1.csv和df2.csv:

import glob
import pandas as pd

files = glob.glob('df*csv')
dfs = []
for file in files:
    df = pd.read_csv(file)
    df['filename'] = file
    dfs.append(df)
df = pd.concat(dfs, ignore_index=True)
df

    a   b   filename
0   1   2   df1.csv
1   3   4   df1.csv
2   5   6   df2.csv
3   7   8   df2.csv

答案 1 :(得分:0)

我的本​​地目录中有多个csv文件。每个文件名包含一些数字。其中一些数字标识文件的年份。我需要在要连接的每个文件中添加一列year,同时我想从文件名中获取年份信息并将其插入该列中。我正在使用regex提取年份并将其连接为20 + 11 = 2011。然后,将列的数据类型设置为int32

pd.concat(
    [
        pd.read_csv(f)
            .assign(year = '20' + re.search('[a-z]+(?P<year>[0-9]{2})', f).group('year'))
            .astype({'year' : 'int32'})
        for f in glob.glob('stateoutflow*[0-9].csv')
    ],
    ignore_index = True
)