在导入许多文件时,使用部分文件名将列添加到pandas数据框

时间:2019-01-03 23:34:44

标签: python pandas

我用它来根据目录中的许多文件制作一个巨型数据框:

path = r'C:\\Users\\me\\data\\'              
all_files = glob.glob(os.path.join(path, "*"))

df_from_each_file = (pd.read_csv(f, sep='\t') for f in all_files)
concatdf = pd.concat(df_from_each_file, ignore_index=True)

该路径中的文件具有类似名称

AAA.etc.etc.
AAA.etc.etc
BBB.etc.etc.

在导入每个文件时,我想向数据框添加一列,该数据框在从该文件导入的所有行旁边都带有AAABBB,如下所示:

col1  col2  col3
data1 data2 AAA
data3 data4 AAA
data1 data2 AAA
data3 data4 AAA
data1 data2 BBB
data3 data4 BBB

3 个答案:

答案 0 :(得分:1)

您可以使用keys + reset_index

进行检查
key=[PureWindowsPath(i).name.split('.', 1)[0] for i in all_files]
concatdf = pd.concat(df_from_each_file, ignore_index=True,keys=key).reset_index(level=0)

答案 1 :(得分:1)

这是一种实现方法:

from pathlib import PureWindowsPath

def fn_helper(fn):
    df = pd.read_csv(fn, sep='\t')
    p = PureWindowsPath(fn)
    part = p.name.split('.')[0]
    df['col3'] = part
    return df

df_from_each_file = (fn_helper(f) for f in all_files)
...

或者正如其他人正在展示的那样:

(pd.read_csv(f, sep='\t').assign(col3=PureWindowsPath(f).name.split('.')[0]) for f in all_files)

答案 2 :(得分:0)

我通常将当前工作目录更改为路径:

import os
os.chdir(path)

您可以使用col3assign分配为所需文件名的一部分。

df_from_each_file = (pd.read_csv(f, sep='\t').assign(col3=f.split('.')[0]) for f in all_files)

所以您的代码如下:

os.chdir(path)
all_files = glob.glob('*')

df_from_each_file = (pd.read_csv(f).assign(col3=f.split('.')[0]) for f in all_files)
concatdf = pd.concat(df_from_each_file, ignore_index=True)

如果不想更改当前工作目录,则可以使用os.path.basename(path)来获取路径中的文件名。因此您的代码应如下所示:

all_files = glob.glob('*')
df_from_each_file = (pd.read_csv(f).assign(col3=os.path.basename(f).split('.')[0]) for f in all_files)
concatdf = pd.concat(df_from_each_file, ignore_index=True)