如何将多个 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

如何将多个列值连接到 Pandas 数据框中的单个列中

使用 Scikit-learn 和 Pandas 将编码列连接到原始数据帧

使用 pandas(和 glob?)合并目录中的大量(csv)数据文本文件

按创建日期过滤多个 csv 文件并连接成一个 pandas DataFrame