对于第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)
答案 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文件和所需行名的摘录。