首页 > 解决方案 > 使用由布尔索引创建的数据框时出错

问题描述

编辑

我有这个数据框:

df = pd.DataFrame({'a':['nonono','sisisis','some_other_string', 'blebleble', 
                        'jajajaja', 'ohyeah','some_string','blablablananana'], 
                   'b':[0,1,2,3,4,5,6,7]})

正如文档所说,我做了一个布尔索引来创建一个新的数据框。

df2 = df.loc[df.a != 'some_string', :]

检查我制作的数据帧长度的差异,print(len(df) > len(df2))输出是True. 这意味着布尔索引正确,不是吗?

但是,KeyError: 6当我训练根据某些条件打印 True 或 False 时,它​​会提高。这是代码:

for i in list(range(len(df2.a))):
  if 'blabla' in df2.a[i]:
    print(True)
  else:
    print(False)

输出是

False
False
False
False
False
False
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-85-2c4113790af5> in <module>()
      1 for i in list(range(len(facturacion.formulario))):
----> 2   if 'NOTA DE CREDITO' in facturacion.formulario[i]:
      3     print(True)
      4   else:
      5     print(False)

1 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4403         k = self._convert_scalar_indexer(k, kind="getitem")
   4404         try:
-> 4405             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4406         except KeyError as e1:
   4407             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 6

如果我做

for i in list(range(len(df2.a[:6]))):
  if 'blabla' in df2.a[i]:
    print(True)
  else:
    print(False)

输出是

False
False
False
False
False
False

我无法意识到发生了什么。有什么建议吗?

标签: pythonpandasdataframefor-loopboolean

解决方案


我认为这是问题所在:

df2.a[i]

您的第 6 个索引在编制索引时被删除

df2 = df.loc[df.a != 'some_string', :]

您应该重置索引:

df2.reset_index(drop=True)

或者你应该使用 loc:

df2.a.loc[i]

推荐阅读