如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?
Posted
技术标签:
【中文标题】如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?【英文标题】:How do I concatenate multiple csv files into a pandas dataframe, with the filenames as the row names? 【发布时间】:2019-03-27 20:19:13 【问题描述】:对于第 1 部分,我有多个 csv 文件,我循环使用这些文件来创建仅包含汇总统计信息(中位数)的新 csv 文件。新的 csv 文件在开始时具有原始文件名 + 'summary_'。这部分没问题。
对于第 2 部分,我想连接所有“summary_”文件(它们彼此具有相同的列名),但连接数据框中的行名称与相应“summary_”的名称相同数据来源的 csv 文件。
在 *** 的帮助下,我已经解决了第 1 部分,但还没有解决第 2 部分。我可以连接所有的 csv 文件,但不仅仅是名称中带有“summary_”的文件(即在第 1 部分中创建的新 csv),而不是正确的行名......
import os
import pandas as pd
import glob
## Part 1
summary_stats = ['median']
filenames = (filename for filename in os.listdir(os.curdir) if os.path.splitext(filename)[1] == '.csv')
for filename in filenames:
df = pd.read_csv(filename, )
summary_df = df.agg(summary_stats)
summary_df.to_csv(f'summary_filename')
## Part 2
path = r'/Users/Desktop/Practice code'
all_files = glob.glob(path + "/*.csv")
list = []
for filename in all_files:
df = pd.read_csv(filename, index_col=None, header=0)
list.append(df)
frame = pd.concat(list, axis=0, ignore_index=True)
【问题讨论】:
【参考方案1】:请确保all_files
仅加载文件
匹配“summary_*.csv”
然后,您可以使用 df.append()
所以你的代码可能看起来像这样
path = r'/Users/Desktop/Practice code'
all_files = glob.glob(path + "/summary_*.csv")
summary_df = None
for filename in all_files:
df = pd.read_csv(filename, index_col=None, header=0)
df['row'] = filename.split('summary_')[1].split('.csv')[0]
df.set_index('row')
if summary_df is None:
summary_df = df
else:
summary_df = summary_df.append(df)
【讨论】:
谢谢!这真的很好。当我打印“all_files”时,会出现以下内容:['/Users/Desktop/Practice code/summary_Case_1.csv', '/Users/Desktop/Practice code/summary_Case_2.csv', '/Users/Desktop/Practice code/summary_Case_3. csv'] 如何将这些文件的名称(例如“summary_Case_1”)分配为连接数据框中的相应行名? 请查看编辑后的代码,我还没有测试过,但应该可以。【参考方案2】:介绍pathlib.Path
,这是一个面向对象的路径接口,可以简化您的生活。
保持您的逻辑,您可以直接在 Path
对象上使用 glob
,然后在加载 csv 文件时与 pandas.concat()
结合使用以连接数据帧。
import pandas
from pathlib import Path
srcdir = Path(r'/Users/Desktop/Practice code') # Get current working directory
df = pd.concat(pd.read_csv(file, index_col=None, header=0) # Concatenate dataframes from generator
for file in srcdir.glob('summary_*.csv'), # Using pathlib.Path's glob
axis=0, ignore_index=True) # Keeping your concat settings
关于行名,您应该在问题中整合您的 summary_*.csv 文件的摘录和所需的行名。
【讨论】:
SyntaxError: 生成器表达式必须用括号括起来 感谢您指出此错误。我认为它是新的,要么从新版本的 Python 或 Pandas 更改(但我还没有找到更改)。您应该能够通过在第一个参数周围添加括号来解决此问题。请不要犹豫,提交对我的答案的修改,此修复正在运行。以上是关于如何将多个 csv 文件连接到 pandas 数据框中,文件名作为行名?的主要内容,如果未能解决你的问题,请参考以下文章
将多个csv文件导入pandas并连接成一个DataFrame
将多个csv文件导入pandas并拼接成一个DataFrame
使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧