当前位置: 首页 > 知识库问答 >
问题:

读取多个csv文件时将文件名附加到列标题

叶元凯
2023-03-14

我想读取多个.csv文件,并将其文件名的日期时间部分附加到列标题中。每个 csv 文件都包含在特定日期时间获取的数据。每个文件名都具有以下格式:

yyyy-mm-DD _ hh-mm-ss _ someothertext

每个文件只包含一列数据。

我成功地将多个文件导入为数据帧列表,如下所示:

import pandas as pd
import glob

path = r'C:\Users\...' #path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

然后,我将这些文件连接成一个数据帧,这样每一列都包含来自其中一个文件的数据:

frame = pd.concat(li, axis=1, ignore_index=True)

然而,这是我丢失文件名信息的地方。列标题现在只是一系列数字。我的问题是:如何在< code>frame中将每个文件名的日期时间部分附加到其各自的列标题上?

我得到的最接近的是能够以迂回的方式附加整个文件名,而不仅仅是日期时间部分,方法是转置框架,将整个文件名添加为新列,转置回来,然后将文件名行设置为标题行......

import os
frame=pd.DataFrame.transpose(frame)
frame['filename'] = os.path.basename(filename)
frame=pd.DataFrame.transpose(frame)
frame.reset_index(drop=True)
frame.columns = frame.iloc[6628] #row 6628 is where the row with the filenames ends up after transposing

这看起来非常低效,最终以整个文件名作为标题,而不仅仅是日期时间部分。

共有1个答案

景景胜
2023-03-14

这是我建议的方法,压缩数据帧并使用正则表达式:

import re
import os
import glob
import pandas as pd

path = 'C:\Users\....'
files = glob.glob(f'{path}\*.csv')

li = []

for file in files:
     name = os.path.basename(file)  # get filename
     date = re.search(r'\d{4}-\d{2}-\d{2}', name).group(0)  # extract yyyy-mm-dd from filename
     # read file, squeeze to Series, rename to date
     li.append(pd.read_csv(file, index_col=None, header=0, squeeze=True).rename(date))  

frame = pd.concat(li, axis=1, ignore_index=False)
 类似资料:
  • 如何在JMeter中将一个csv文件循环到另一个csv文件,其中第一个csv文件包含所有登录数据,另一个csv文件包含交易数据。我应该运行1个出纳员应该处理30笔交易的地方。

  • 问题内容: 我正在使用opencsv将Java bean写入带有标头的CSV文件中。文件名包含当前日期。如果用户在同一天第二次运行它,它将追加到文件中,但添加另一个标题行。 如何附加到文件但没有列标题。 问题答案: 好一个 在opencsv中进行编写时,我们并不怎么想追加内容,因为它可能存在风险(出问题了,您可能会破坏本来很好的文件),因此倾向于使用写入。 那就是说在sourceforge中打开一

  • 我想从多列csv文件中读取特定列,并使用Java在其他csv文件中打印这些列。需要帮忙吗?下面是我逐行打印每个令牌的代码。。但我希望只打印多列csv中的几列。

  • 问题内容: 我有一个包含以下各列的csv文件: 身份证,姓名,年龄,性别 接下来是以上各列的很多值。我试图单独读取列名称,并将其放在列表中。 我正在使用Dictreader,它给出了正确的细节: 但是我想做的是,我需要使用输入csv自动解析列列表(在上述情况下为“ i”),而不是在列表中进行硬编码。 这给出了一个错误 在行打印行[x]中。我要去哪里错了?是否可以使用Dictreader提取列名称?

  • 我有一个包含以下列的csv文件: 身份证、姓名、年龄、性别 后面是上述列的许多值。我试图单独阅读列名,并将其放入列表中。 我正在使用Dictreader,这提供了正确的详细信息: 但我想做的是,我需要用输入csv自动解析列列表,而不是在列表中硬编码。 这给出了一个错误 在行打印行[x]中。我哪里做错了?是否可以使用Dictreader获取列名?

  • /tmp/data/myfile1.csv,/tmp/data/myfile2.csv,/tmp/data.myfile3.csv,/tmp/datamyfile4.csv 我希望将这些文件读入Spark DataFrame或RDD,并且希望每个文件都是DataFrame的一个解析。我怎么能这么做?