【问题标题】:Search multiple CSVs for one particular value在多个 CSV 中搜索一个特定值
【发布时间】:2022-01-06 12:26:02
【问题描述】:

我有一个 CSV 文件目录,其中列出了水果和数量,我想搜索所有这些文件并创建一个仅包含特定水果(例如“苹果”)的新 CSV。

list1.csv

| Name     | Qty |
| -------- | --- |
| apple    |15   | 
| apple    |50   |
| mango    |20   | 
| grapes   |49   |

list2.csv

| Name     | Qty |
| -------- | --- |
| apple    |25   | 
| apple    |50   |
| Banana   |34   |
| mango    |20   | 
| grapes   |49   |

list3.csv

| Name     | Qty |
| -------- | --- |
| apple    |125   | 
| apple    |530   |
| mango    |20   | 
| grapes   |49   |

我想要,对于“苹果”:

new.csv

| Name     | Qty |
| -------- | --- |
| apple    |15   | 
| apple    |50   |
| apple    |25   | 
| apple    |50   |
| apple    |125  | 
| apple    |530  |
import pandas as pd
import glob, os
path = ("E:/Data/Fdata")
all_files = glob.glob(path + "/*.csv")
li=[]
for filename in all_files:
    df=pd.read_csv(filename, index_col=None, header=0)
    ndf = df[df["Name"].str.contains("Apple")]
    li.append(ndf)
    ndf.to_csv("E:/Data/Fdata/onlyapple.csv", index=True)

【问题讨论】:

  • ndf.to_csv 移到for 循环之外。即删除缩进。
  • 这种方式也不行
  • 什么是“不工作”?提供您的 csv 文件、当前输出和预期输出的示例。
  • list1.csv 苹果 15 500 苹果 50 400 芒果 20 500 葡萄 49 855 list2.csv 苹果 15 500 芒果 20 500 苹果 50 400 芒果 20 500 葡萄 49 855 我想要一个新的.csv想要苹果 15 500 苹果 50 400 苹果 15 500 苹果 50 400

标签: python pandas csv append glob


【解决方案1】:

以下是不使用 Pandas 的方法:

import csv
import glob

fruit = 'apple'

final = []
header = []

for file in glob.glob('./*.csv'):
    with open(file, newline='') as f:
        reader = csv.reader(f)
        header = next(reader)  # header should be same for each file

        for row in reader:
            if row[0] == fruit:
                final.append(row)

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)    # use the last file's header
    writer.writerows(final)

下面是如何使用 GoCSV 的命令、stack(将文件一个一个堆叠)和 filter(将只过滤掉你想要的行):

gocsv stack *.csv | gocsv filter -c Name -eq apple

【讨论】:

  • 当目录有大约 100 个 csv 时,上面的代码给出了所需的输出。但除此之外(比如 700 左右,我的工作目录),它会提供一个空白 csv 作为输出。
  • 嘿,对于更大的文件列表,这真是令人沮丧。我刚刚模拟了 1000 个文件,它运行良好。你在使用 Windows 吗?也许尝试[f for f in os.listdir('.') if f.endswith('csv')] 而不是 glob。
  • 是的,我使用的是 Windows。并尝试 [f for f in os.listdir('.') if f.endswith('csv')] 为好。这也给出了一个只有标题行的空白 csv。并且它需要更长的时间来执行。有什么建议吗?
  • 如果标题存在,则表示正在读取文件。在循环中添加一些 print() 语句,以确保所有文件都被循环,由 CSV 阅读器打开。还有,你换水果了吗?如果您指定的水果不在文件中,那也会导致输出文件只有标题。
  • 不,水果名称在文件中。它正在处理较少数量的文件。只有当有更多文件时,它才有点挂起。是内存问题还是什么?
【解决方案2】:
  1. 将所有 csv 文件读取到 master DataFrame
  2. 过滤你想要的“名称”并写to_csv
import os
import pandas as pd

master = pd.DataFrame()
for file in [f for f in os.listdir(".") if f.endswith("csv")]:
    master = master.append(pd.read_csv(file), ignore_index=True)
    
master[master["Name"].eq("apple")].reset_index(drop=True).to_csv("onlyapple.csv")
只有apple.csv:
,Name,quantity,price
0,apple,15,500
1,apple,50,400
2,apple,15,500
3,apple,50,400

【讨论】:

  • 完美运行。非常感谢。
  • @Sabir - 乐于助人! :)
猜你喜欢
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多