迭代文件夹中的文件

时间:2016-11-19 17:03:46

标签: python pandas for-loop iteration glob

我正在使用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 

我最好定义一个函数来选择包含字符串的相关行:“氨苄西林”,“阿莫西林”和“共同阿莫西克拉夫”;然后总计每个项目的项目数(即总计名为'ITEMS'的列),然后我可以在for循环中使用它来迭代每个文件。

欢迎任何有关如何避免此错误并实现上述目标的指示。

非常感谢! :)

2 个答案:

答案 0 :(得分:2)

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

你需要

df = pd.read_csv(...)

然后你可以使用

df['BNF NAME']

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

df['ITEMS']

答案 1 :(得分:1)

您的代码中存在两个问题:

1)pd.read_csv的返回值不存储在变量中。这就是您获得TypeError的原因 - 您尝试对f(文件名)进行操作,就像它是DataFrame一样。

2)过滤器不起作用,因为表达式从里到外进行评估。要解决此问题,您可以创建一个选项列表,然后使用isin来测试目标是否在列表中,如下所示:

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