【问题标题】:Recursively Edit CSV to Subdirectories using Pandas使用 Pandas 将 CSV 递归编辑到子目录
【发布时间】:2020-01-20 14:50:55
【问题描述】:

我有一系列子目录文件夹,每个文件夹都有一个“_Invoice.csv”。

/Invoice List/
              Invoice1folder/
                             ..._Invoice.csv
              Invoice2folder/ 
                             ..._Invoice.csv
              Invoice5folder/
                             ..._Invoice.csv
              Invoice9folder/
                             _Invoice.csv

对于每个“_Invoice.csv”,我都有 [A、B、C、D] 列。我正在尝试递归搜索所有子目录文件夹,打开每个“_Invoice.csv”文件并将列减少到只有 [A,C],然后将其保存为“_Invoice_Reduced.csv”。

"_Invoice.csv"       "_Invoice_Reduced.csv"
 A B C D        =>              A C
 1 2 3 4        =>              1 3 

我目前的尝试是:

import pandas as pd
import os

columns_to_keep = ['A','C']
final_form= pd.DataFrame()

for file in os.listdir():
    if file.endswith('*_Invoice.csv'):
        df = pd.read_csv(file)
        df = df.loc[;columns_to_keep]
        df = df.to_csv(f'{file.name}_Invoice_Reduced.csv')
   if file.endswith('*_Invoice_Reduced.csv'):
        df = pd.read_csv(file)
        final_form= final_form.append(df, ignore_index=True)

TLDR:我正在尝试创建一个进入每个子目录的脚本,减少预先存在的 CSV,减少 CSV 的列并保存子集。然后在它读取所有子目录后,将缩减后的文件合并到一个 big_frame 中。

有什么想法吗?

【问题讨论】:

  • 您当前代码的行为是什么,它与您希望它做的事情有何不同?首先的想法是您可能不希望在endswith 测试中使用*(除非您使用glob),并且第一次运行代码时,您的第二个if 语句(寻找_Invoice_Reduced.csv)不会触发,因为循环的文件名是在您进行任何处理之前生成的。
  • 通过一些基本的调试,您至少可以捕获其中的一些。

标签: python pandas csv


【解决方案1】:

这样就可以了。

而不是打开,删除列,保存并继续;我选择只打开减少的列,保存这个减少的 DataFrame,然后附加到df。这将导致所有减少的文件都堆叠在这个 DataFrame 中。

使用path = "." 从当前目录跳转

from pathlib import Path
import pandas as pd


df = pd.DataFrame()
columns_to_keep = ['A','C']
path = "."
pattern = "*_Invoice.csv"

for file in Path(path).rglob(pattern):
    output_file = "{}/{}{}".format(file.parent, file.stem, "_Reduced.csv")
    _df = pd.read_csv(file, usecols=columns_to_keep)
    _df.to_csv(output_file, sep=",", index=False, header=True)
    df = pd.concat([df, _df])

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 2015-09-28
    • 2017-03-26
    • 1970-01-01
    • 2010-10-14
    • 2012-11-23
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    相关资源
    最近更新 更多