Estoy tratando de hacer coincidir con un objeto de lista con Pandas DataFrame, tengo una condición aquí donde el objeto de lista que contiene los nombres de las columnas, por lo que, a veces, el contexto de datos puede contener todos los nombres que están en matchObj pero los tiempos en que el flujo de datos Solo tendrá pocos nombres de columnas solo en esa situación, no logra hacer el trabajo.

A continuación se muestra mis listas de ejemplo matchObj y matchObj1 por ejemplo:

>>> matchObj = ['equity01',  'equity02',  'equity1'  'equity2']
>>> matchObj1 = ['equity01',  'equity02']

A continuación se muestra el flujo de datos:

>>> df
   equity01  equity02  equity03  equity04  equity05
0         1         4         7         2         5
1         2         5         8         3         6
2         3         6         9         4         7

Mientras estoy usando la lista matchobj1 contra DF funciona, ya que encuentra los nombres de las columnas.

>>> print(df[matchObj1])
   equity01  equity02
0         1         4
1         2         5
2         3         6

Sin embargo, no funciona con matchobj porque DF no contiene el equity1 equity2, por lo tanto, lanza el KeyError: "['equity1equity2'] not in index"

>>> print(df[matchObj])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/grid/common/pkgs/python/v3.6.1/lib/python3.6/site-packages/pandas/core/frame.py", line 2133, in __getitem__
    return self._getitem_array(key)
  File "/grid/common/pkgs/python/v3.6.1/lib/python3.6/site-packages/pandas/core/frame.py", line 2177, in _getitem_array
    indexer = self.loc._convert_to_indexer(key, axis=1)
  File "/grid/common/pkgs/python/v3.6.1/lib/python3.6/site-packages/pandas/core/indexing.py", line 1269, in _convert_to_indexer
    .format(mask=objarr[mask]))
KeyError: "['equity1equity2'] not in index"
1
user294110 14 jul. 2019 a las 13:11

1 respuesta

La mejor respuesta

Usar -

print(df[[i for i in matchObj if i in df.columns]])

Salida

   equity01  equity02
0         1         4
1         2         5
2         3         6

Explicación

[i for i in matchObj if i in df.columns] solo obtiene columnas que están presentes en df. Ignora todo el resto. Espero que ayude.

2
Vivek Kalyanarangan 14 jul. 2019 a las 10:17