2016-11-19 152 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'])