我正在尝试将一堆csv加载到数据库中,并希望摆脱这些表中具有值" - "的任何行。我试图在下面的链接中做同样的事情,但使用可迭代而不是预定的列,因为我不知道哪些表和列将具有这些值:
Deleting DataFrame row in Pandas based on column value
我的代码: dfs = {}
for doc in fList:
i = "{}\\{}".format(path, doc)
df = pd.read_csv(i)
for col in df.columns:
df = df[df.col != "-"]
这会返回以下错误:
AttributeError Traceback (most recent call last)
<ipython-input-291-43edac7a4ed7> in <module>()
8 #print dfs
9 for col in df:
---> 10 df = df[df.col != "-"]
C:\ProgramData\Anaconda2\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
2968 if name in self._info_axis:
2969 return self[name]
-> 2970 return object.__getattribute__(self, name)
2971
2972 def __setattr__(self, name, value):
AttributeError: 'DataFrame' object has no attribute 'col'
似乎我不能在循环中使用iterable。如果我必须打开每个文件并更改值,它将打败编写脚本的操作。反正是否循环遍历表并删除带有错误值的行?
答案 0 :(得分:3)
您无法在尝试时使用变量动态访问df
列,从而导致AttributeError
。因为.
会搜索df's
属性col
,而不是df
的属性<value in col>
。这有区别。
如果您愿意,您需要__getitem__
访问者; df[col]
。但是,您应该尽可能避免使用循环解决方案。以下是几种选择。
选项1
对于您的情况,eq
+ any
就足够了。
df = df[df.astype(str).eq('-').any(1)] # `astype` conversion
或者,
df = df[df.select_dtypes(['object']).eq('-').any(1)] # `select_dtypes`, thanks MaxU!
选项2
另一种选择是使用na_values
read_csv
参数,因此在读取数据时,这些值将转换为NaN,您可以将其删除。
df = pd.read_csv('file.csv', na_values=['-'])
现在,请在您的数据上调用dropna
-
df.dropna(inplace=True)