Comment créer une classe mixin pour pandas DataFrame et Python natif dict de telle sorte que les colonnes de dataframe puissent être accédées comme un dictionnaire imbriqué?Création d'une classe Mixin pour pandas DataFrame et Python natif dict
À partir de Accessing pandas DataFrame as a nested list, en utilisant la fonction df.loc()
est le moyen d'accéder à la rangée/colonne/tranches désirées. Mais le but est d'accéder à l'image-données 2-D en utilisant la même syntaxe qu'un dicton Python natif. Par exemple.
>>> import pandas as pd
>>> df = pd.DataFrame([['x', 1,2,3,4,5], ['y', 6,7,8,9,10], ['z', 11,12,13,14,15]])
>>> df.columns = ['index', 'a', 'b', 'c', 'd', 'e']
>>> df = df.set_index(['index'])
>>> df
a b c d e
index
x 1 2 3 4 5
y 6 7 8 9 10
z 11 12 13 14 15
>>> df['x']
[1, 2, 3, 4, 5]
>>> df['x']['a']
1
>>> df['x']['a', 'b']
(1, 2)
>>> df['x']['a', 'd', 'c']
(1, 4, 3)
J'ai essayé de créer une classe mixin en tant que tel:
from pandas import DataFrame
class VegeTable(DataFrame, dict):
def __init__(self, *args, **kwargs):
DataFrame.__init__(self, *args, **kwargs)
def __getitem__(self, row_key, column_key):
if type(row_key) != list:
row_key = [row_key]
if type(column_key) != list:
column_key = [column_key]
return df.loc[row_key, column_key]
Mais je pense qu'il ya quelque chose qui manque tel que l'accès clé dictionnaire ne fonctionne pas et le dict.get
retourne une des valeurs étranges:
>>> from pandas import DataFrame
>>>
>>>
>>> class VegeTable(DataFrame, dict):
... def __init__(self, *args, **kwargs):
... DataFrame.__init__(self, *args, **kwargs)
... def __getitem__(self, row_key, column_key):
... if type(row_key) != list:
... row_key = [row_key]
... if type(column_key) != list:
... column_key = [column_key]
... return df.loc[row_key, column_key]
...
>>>
>>> vt = VegeTable([['x', 1,2,3,4,5], ['y', 6,7,8,9,10], ['z', 11,12,13,14,15]])
>>> vt.columns = ['index', 'a', 'b', 'c', 'd', 'e']
>>> vt = vt.set_index(['index'])
>>> vt
a b c d e
index
x 1 2 3 4 5
y 6 7 8 9 10
z 11 12 13 14 15
>>> vt['x']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/pandas/core/frame.py", line 2062, in __getitem__
return self._getitem_column(key)
File "/usr/local/lib/python2.7/site-packages/pandas/core/frame.py", line 2069, in _getitem_column
return self._get_item_cache(key)
File "/usr/local/lib/python2.7/site-packages/pandas/core/generic.py", line 1534, in _get_item_cache
values = self._data.get(item)
File "/usr/local/lib/python2.7/site-packages/pandas/core/internals.py", line 3590, in get
loc = self.items.get_loc(item)
File "/usr/local/lib/python2.7/site-packages/pandas/core/indexes/base.py", line 2395, in get_loc
return self._engine.get_loc(self._maybe_cast_indexer(key))
File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5239)
File "pandas/_libs/index.pyx", line 154, in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5085)
File "pandas/_libs/hashtable_class_helper.pxi", line 1207, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20405)
File "pandas/_libs/hashtable_class_helper.pxi", line 1215, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20359)
KeyError: 'x'
>>> vt.get(['x'])
>>> vt.get('x')
>>> vt.get('x', 'a')
'a'
>>> vt.get('x', ['a', 'b'])
['a', 'b']
>>> vt.get('x', ['a', 'b'])
Comment créer une classe mixin pour pandas géants et dataframe dict Python natif telles que les colonnes de trame de données sont accessibles comme un Dict imbriqué? Est-ce possible? Si c'est le cas, comment?
Si vous deviez utiliser '__getitem__' pour la ligne accès, au lieu de l'accès de la colonne en cours, comment proposez-vous de faire l'accès aux colonnes? –
Identique à l'accès à un dict imbriqué 'defaultdict (dict)', c'est-à-dire 'vt [row_ids, column_ids]' Et pour l'accès aux lignes, 'vt [row_ids]'. – alvas