2016-11-19 241 views
1

我使用熊猫阅读和分析大型NHS处方数据集。它们分别保存为文件夹中的csv文件。 我想要将相同的几行代码分别应用于这些文件中的每一个 - 所以我想单独读取每个数据帧和大熊猫,然后提取相关数据并执行基本计算。遍历文件夹中的文件

这是到目前为止我的代码:

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循环中遍历每个文件。

希望有关如何避免这个错误,并实现上述任何指针。

非常感谢! :)

+0

始终显示完整的错误消息(Traceback)。还有其他有用的信息 - 即。哪一行出问题。 – furas

+0

提示 - 使用'glob.iglob'而不是'glob.glob'。它返回一个生成器而不是'list',如果你迭代了很多文件,这是非常有用的。 – Billy

+0

,并且不要在你的for循环中重新分配'f' - 这会让你很困惑。 – Billy

回答

2

f是文件名,但您使用它作为DataFrame - f['BNF NAME']

你需要

df = pd.read_csv(...) 

,然后你可以使用

df['BNF NAME'] 

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

df['ITEMS'] 
1

有在你的代码的两个问题:

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

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

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