【问题标题】:Iterating through files in a folder遍历文件夹中的文件
【发布时间】:2017-04-03 09:32:33
【问题描述】:

我正在使用 pandas 来读取和分析大型 NHS 处方数据集。它们单独保存为文件夹中的 csv 文件。 我想分别对每个文件应用相同的几行代码 - 所以我想用 pandas 单独读取每个数据帧,然后提取相关数据并执行基本计算。

这是我目前的代码:

import pandas as pd
import glob

path = "/Volumes/TOSHIBA EXT/Datasets/2015"
all_files = glob.glob(path + "/*.CSV")

for f in all_files:
    pd.read_csv(f,index_col=None, header=0, usecols=[2,4,5], names=['PRACTICE','BNF NAME', 'ITEMS'])
    f=f[f['BNF NAME'].str.contains('Ampicillin' and 'Amoxicillin' and 'Co-Amoxiclav')]
    print pd.to_numeric(f['ITEMS']).sum()

但是出现以下错误..

TypeError: string indices must be integers, not str 

理想情况下,我想定义一个函数来选择包含以下字符串的相关行:“Ampicillin”、“Amoxicillin”和“Co-Amoxiclav”;然后总计每个项目的数量(即总计名为“ITEMS”的列),然后我可以在 for 循环中使用它来遍历每个文件。

不胜感激有关如何避免此错误并实现上述目标的任何指示。

非常感谢! :)

【问题讨论】:

  • 总是显示完整的错误信息(Traceback)。还有其他有用的信息 - 即。哪一行有问题。
  • 提示 - 使用 glob.iglob 而不是 glob.glob。它返回一个生成器而不是 list,如果您要迭代许多文件,这将非常有用。
  • 并且不要在你的 for 循环中重新分配 f - 这会让它非常混乱。

标签: python pandas for-loop iteration glob


【解决方案1】:

f 是文件名,但您将其用作 DataFrame - f['BNF NAME']。

你需要

df = pd.read_csv(...)

然后你可以使用

df['BNF NAME']

df = df[ df['BNF NAME'] ... ]

df['ITEMS']

【讨论】:

    【解决方案2】:

    您的代码中有两个问题:

    1) pd.read_csv 的返回值不存储在变量中。这就是为什么你会得到一个TypeError - 你正在尝试对f(文件名)进行操作,就好像它是一个DataFrame。

    2) 过滤器不起作用,因为表达式是从内向外计算的。为了解决这个问题,您可以创建一个选项列表,然后使用isin 来测试目标是否在列表中,如下所示:

    df["BNF Name"].isin(['Ampicillin', 'Amoxicillin', 'Co-Amoxiclav'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2023-01-20
      • 2014-09-28
      • 2019-05-08
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多