无法将迭代传递给pandas df以删除具有特定值的行

时间:2018-01-15 21:50:17

标签: python pandas

我正在尝试将一堆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。如果我必须打开每个文件并更改值,它将打败编写脚本的操作。反正是否循环遍历表并删除带有错误值的行?

1 个答案:

答案 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)