我用它来根据目录中的许多文件制作一个巨型数据框:
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.
在导入每个文件时,我想向数据框添加一列,该数据框在从该文件导入的所有行旁边都带有AAA
或BBB
,如下所示:
col1 col2 col3
data1 data2 AAA
data3 data4 AAA
data1 data2 AAA
data3 data4 AAA
data1 data2 BBB
data3 data4 BBB
答案 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)
您可以使用col3
将assign
分配为所需文件名的一部分。
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)