【问题标题】:Concatenate Multiples CSV files in one dataframe在一个数据框中连接多个 CSV 文件
【发布时间】:2020-01-18 19:11:58
【问题描述】:

我在 python 方面相对较新。这是我想做的。我有一个包含多个 csv 文件的文件夹(2018.csv2017.csv2016.csv,... 等等),准确地说是 500 个 CSV 文件。每个 CSV 文件都包含标题“date”、“Code”、“Cur”、“Price”等。我想将所有 500 个 CSV 文件连接到一个数据名中。这是我的一个 csv 文件的代码,但它非常慢。我想对所有 500 个文件执行此操作并连接到一个数据帧:

DB_2017 = pd.read_csv("C:/folder/2018.dat",sep=",", header =None).iloc[: 0,4,5,6]

DB_2017.columns =["date","Code","Cur",Price]

DB_2017['Code'] =DB_2017['Code'].map(lambdax:x.lstrip('@').rstrip('@'))

DB_2017['Cur'] =DB_2017['Cur'].map(lambdax:x.lstrip('@').rstrip('@'))

DB_2017['date'] =DB_2017['date'].apply(lambdax:pd.timestamp(str(x)[:10)

DB_2017['Price'] =pd.to_numeric(DB_2017.Price.replace(',',';')

【问题讨论】:

  • 欢迎来到 SO!请花点时间阅读有关如何发布熊猫问题的信息:stackoverflow.com/questions/20109391/…
  • 你读过熊猫文档吗?您可以直接在pandas.read_csv() 中指定列名。您不需要映射和 lambda 来从列中删除字符。

标签: python pandas


【解决方案1】:

您可以执行以下操作:

def clean_up(df):
    df = df.iloc[:,[0,4,5,6]]
    df.columns = ["date","Code","Cur","Price"]
    df['Code'] = df['Code'].map(lambda x:x.lstrip('@').rstrip('@'))
    df['Cur'] = df['Cur'].map(lambda x:x.lstrip('@').rstrip('@'))
    df['date'] = df['date'].apply(lambda x:pd.timestamp(str(x)[:10]))
    df['Price'] = pd.to_numeric(df['Price'].replace(',',';'), errors='coerce')
    return df

from pathlib import Path

file_path = Path("your_files_path/")

df = pd.concat([clean_up(pd.read_csv(i)) for  i in file_path.iterdir()])

如果您的路径/文件夹包含 .csv 以外的文件,您可以使用以下方法过滤 csv 文件:

df = pd.concat([pd.read_csv(i) for  i in file_path.glob('**/*.csv')])

要阅读.dat 文件,我想你可以这样做:

df = pd.concat([pd.read_fwf(i) for  i in file_path.glob('**/*.dat')])

要阅读.dat文件(一个小样本),我想你可以这样做:

n = 5
df = pd.concat([pd.read_fwf(i) for  i in file_path.glob('**/*.dat')[:n])

【讨论】:

  • 请检查编辑,看起来我错过了那部分。
  • 你有多少个文件?检查编辑,可能是文件格式有问题。尝试读取前 n 个文件,看看是否顺利
  • 我有 50 个文件,每个文件包含 56 个 MO...非常庞大...代码仍在运行中
【解决方案2】:

考虑设置一个通用方法来读取 csv 并执行所需的数据清理。然后,遍历文件目录以构建用于连接的数据框列表。请务必使用所有需要的 read_csv 参数,包括默认值:

import os
import pandas as pd

def proc_df(csv_file)
  DB = pd.read_csv(csv_file, header = None, sep=";",
                   names = ["date", "Code", "Cur", "Price"], 
                   usecols = [0,4,5,6])

  DB['Code'] = DB['Code'].str.lstrip('@').str.rstrip('@')
  DB['Cur'] = DB['Cur'].str.lstrip('@').str.rstrip('@')
  DB['date'] = pd.timestamp(DB['date'].str([:10]))
  DB['Price'] = pd.to_numeric(DB['Price'].replace(',',';')

  return DB

path = "C:/directory/to/data"

df_list = [proc_df(os.path.join(path, f)) for f in os.listdir(path)]

final_df = pd.concat(df_list, ignore_index = True)

【讨论】:

  • 这是我得到的错误“系列'对象没有属性'rstrip'”
  • 我在这里面临的大问题是时间和内存......因为每个文件包含 55 MO 而我有 100 个文件......
  • 什么对你来说很慢? 5 分钟。还是 50 分钟?请注释掉read_csv 之后的每一行函数,而不是return 以检查最慢的行。 100个文件不算多。什么是 MO?
  • 啊抱歉我的意思是说 50 Mega Octet.. 3 小时后我设法保存了 CSV 文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多