如何将多个csv文件连接到一个以行名作为文件名的pandas数据框中?

时间:2019-03-27 20:19:13

标签: python dataframe concatenation

对于第1部分,我有多个csv文件,可以循环使用这些文件来创建仅具有摘要统计信息(中位数)的新csv文件。新的csv文件开头具有原始文件名+'summary_'。这部分还可以。

对于第2部分,我想串联所有“ summary_”文件(它们具有相同的列名),但是串联数据框中的行名与相应“ summary_”的名称相同数据来自的csv文件。

在stackoverflow的帮助下,我已经解决了第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)

2 个答案:

答案 0 :(得分:0)

  • 请确保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)

答案 1 :(得分:0)

引入pathlib.Path,这是一个简化路径的面向对象的界面。

保持逻辑,您可以直接在glob对象上使用Path,然后在加载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文件和所需行名的摘录。