0
votes

Découper correctement les espaces sur un fichier de dataframe de pandas?

J'essaie d'accomplir une tâche simple de couper tout blanc sur chaque colonne de mon Dataframe. J'ai des valeurs qui ont des espaces de fuite après des mots, avant des mots et des colonnes contenant uniquement une valeur "" code>. Je veux tout ça dépouillé.

J'ai lu Ce message qui a donné un excellent moyen d'accomplir ceci: data_frame_trimmed = data_frame.apply (lambda x: x.strip () si x.dtype == "objet" else x) code> p>

Cependant, je reçois souvent ce qui suit: P>

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-31d35db1d48c> in <module>
      1 df = (pd.read_csv('C:\\Users\\wundermahn\Desktop\\aggregated_po_data.csv',
----> 2                     encoding = "ISO-8859-1", low_memory=False).apply(lambda x: x.str.strip() if (x.dtype == "object") else x))
      3 print(df.shape)
      4 
      5 label = df['class']

c:\python367-64\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, raw, result_type, args, **kwds)
   6876             kwds=kwds,
   6877         )
-> 6878         return op.get_result()
   6879 
   6880     def applymap(self, func) -> "DataFrame":

c:\python367-64\lib\site-packages\pandas\core\apply.py in get_result(self)
    184             return self.apply_raw()
    185 
--> 186         return self.apply_standard()
    187 
    188     def apply_empty_result(self):

c:\python367-64\lib\site-packages\pandas\core\apply.py in apply_standard(self)
    294             try:
    295                 result = libreduction.compute_reduction(
--> 296                     values, self.f, axis=self.axis, dummy=dummy, labels=labels
    297                 )
    298             except ValueError as err:

pandas\_libs\reduction.pyx in pandas._libs.reduction.compute_reduction()

pandas\_libs\reduction.pyx in pandas._libs.reduction.Reducer.get_result()

<ipython-input-9-31d35db1d48c> in <lambda>(x)
      1 df = (pd.read_csv('C:\\Users\\wundermahn\Desktop\\aggregated_data.csv',
----> 2                     encoding = "ISO-8859-1", low_memory=False).apply(lambda x: x.str.strip() if (x.dtype == "object") else x))
      3 print(df.shape)
      4 
      5 label = df['ON_TIME']

c:\python367-64\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   5268             or name in self._accessors
   5269         ):
-> 5270             return object.__getattribute__(self, name)
   5271         else:
   5272             if self._info_axis._can_hold_identifiers_and_holds_name(name):

c:\python367-64\lib\site-packages\pandas\core\accessor.py in __get__(self, obj, cls)
    185             # we're accessing the attribute of the class, i.e., Dataset.geo
    186             return self._accessor
--> 187         accessor_obj = self._accessor(obj)
    188         # Replace the property with the accessor object. Inspired by:
    189         # http://www.pydanny.com/cached-property.html

c:\python367-64\lib\site-packages\pandas\core\strings.py in __init__(self, data)
   2039 
   2040     def __init__(self, data):
-> 2041         self._inferred_dtype = self._validate(data)
   2042         self._is_categorical = is_categorical_dtype(data)
   2043         self._is_string = data.dtype.name == "string"

c:\python367-64\lib\site-packages\pandas\core\strings.py in _validate(data)
   2096 
   2097         if inferred_dtype not in allowed_types:
-> 2098             raise AttributeError("Can only use .str accessor with string values!")
   2099         return inferred_dtype
   2100 

**AttributeError: Can only use .str accessor with string values!**


2 commentaires

Savez-vous à l'avance quel est le type de vos colonnes?


Je ne. C'est le problème - le Dataframe me donne une sorte de question sous la forme d'une requête SQL . Je ne sais pas grand chose sur les données du tout. Et la forme est sur (401801, 267) , il est donc assez lourd de tenter de passer par la colonne par colonne. Je suis désolé @Riccardobucco


3 Réponses :


1
votes

Vous pouvez essayer essayer à la place: xxx


0 commentaires

0
votes

Utilisation de SELECT_DTYPES CODE> Pour sélectionner les colonnes correctes:

str_cols = df.select_dtypes('object').columns
df[str_cols] = df[str_cols].apply(lambda x: x.str.strip())

print(df)
   col1 col2  col3     col4
0     1    a   4.0      foo
1     2    b   5.0      bar
2     3    c   6.0  foobar.


2 commentaires

Votre approche est similaire à OP. Il échouera s'il y a une colonne avec, par exemple, des valeurs de liste.


C'est une bonne tentative! Je ne l'ai pas abordé de cette façon, mais ce que j'ai trouvé, c'est que objet contient des valeurs différentes. Par exemple, parfois a et parfois 1 et parfois ""



1
votes

Vous devez vérifier le type de colonne, mais le type de chaque individuel forte>, Donc, le code peut être E.G.:

cols = df.select_dtypes(include='object').columns
df[cols] = df[cols].applymap(lambda x: x.strip() if type(x) == str else x)
  • Il peut y avoir une colonne de objet em> type, li>
  • contenant un string em> dans presque toutes les cellules, li>
  • Mais certains d'entre eux peuvent être nan em> qui est un cas particulier de float em>, donc Vous ne pouvez pas appeler bande em> dessus. li> ul>

    Mais de cette façon, vous exécutez inutilement le code des colonnes de types de types autre que objet em>, où rien ne sera changé. Si cela vous dérange, exécutez ce code uniquement pour les colonnes dans lesquelles il est probable Pour changer quoi que ce soit: p> xxx pré> p>


0 commentaires