我正在使用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循环中使用它来迭代每个文件。
欢迎任何有关如何避免此错误并实现上述目标的指示。
非常感谢! :)
答案 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'])